Помогите с SQL Server Trigger для обрезки неверных данных перед вставкой - PullRequest
3 голосов
/ 23 мая 2011

Мы используем веб-сервис, который решил изменить максимальную длину поля с 255. У нас есть устаревшая таблица поставщиков, которая по-прежнему ограничена 255. Мы надеемся использовать триггер для временного решения этой проблемы до мы можем реализовать более удобное для бизнеса решение в нашей следующей итерации.

Вот с чего я начал:

CREATE TRIGGER [mySchema].[TruncDescription] 
ON  [mySchema].[myTable] 
INSTEAD OF INSERT
AS 
BEGIN
SET NOCOUNT ON;

INSERT INTO [mySchema].[myTable]
SELECT SubType, type, substring(description, 1, 255)
FROM inserted
END

Однако, когда я пытаюсь вставить на myTable, я получаю ошибку:

Строка или двоичные данные будут усеченный. Заявление было прекращается.

Я пытался поэкспериментировать с SET ANSI_WARNINGS OFF, который позволял работать запросу, но затем просто не вставлял никаких данных в столбец описания.

Есть ли способ использовать триггер для обрезания слишком длинных данных, или есть другая альтернатива, которую я могу использовать, пока не будет разработано более красноречивое решение? Мы довольно ограничены в модификациях таблиц (т.е. мы не можем), потому что это таблица поставщиков, и мы не контролируем веб-сервис, который мы потребляем, поэтому мы не можем попросить их исправить это. Любая помощь будет оценена.

Ответы [ 3 ]

2 голосов
/ 24 мая 2011

Этого нельзя избежать, поскольку ошибка возникает при заполнении вставленной таблицы.

Из документации: http://msdn.microsoft.com/en-us/library/ms191300.aspx

"Формат вставленных и удаленных таблиц - этотакой же, как и формат таблицы, для которой определен триггер INSTEAD OF. Каждый столбец во вставленной и удаленной таблицах отображается непосредственно на столбец в базовой таблице.думать о том, чтобы использовать в своих интересах схемы и схему по умолчанию, используемую при входе в систему.Если вы можете получить имя входа, которое веб-служба использует для ссылки на другую таблицу, вы можете увеличить размер столбца в этой таблице и использовать триггер INSTEAD OF INSERT, чтобы выполнить INSERT в таблице поставщиков.Вариантом этого является создание таблицы в другой базе данных и установка базы данных по умолчанию для входа в веб-службу.

CREATE TRIGGER [myDB].[mySchema].[TruncDescription] 
ON  [myDB].[mySchema].[myTable] 
INSTEAD OF INSERT
AS 
BEGIN
SET NOCOUNT ON;

INSERT INTO [VendorDB].[VendorSchema].[VendorTable]
SELECT SubType, type, substring(description, 1, 255)
FROM inserted
END
2 голосов
/ 24 мая 2011

С этой настройкой у меня все работает нормально.Не констатируй очевидное, но ты уверен, что во время тестирования в поле описания есть данные?Возможно, они меняют одно из других полей, которые вы вставляете, и, может быть, одно из них выдает ошибку?

CREATE TABLE [dbo].[DataPlay](
    [Data] [nvarchar](255) NULL
) ON [PRIMARY]
GO

и триггер, подобный этому

Create TRIGGER updT ON  DataPlay 
Instead of Insert 
AS 
BEGIN
    SET NOCOUNT ON;     
INSERT INTO [tempdb].[dbo].[DataPlay]
           ([Data])
           (Select substring(Data, 1, 255) from inserted)
END
GO

, затем вставляетес

Declare @d as nvarchar(max)
Select @d = REPLICATE('a', 500)
SET ANSI_WARNINGS OFF
INSERT INTO [tempdb].[dbo].[DataPlay]
           ([Data])
     VALUES
           (@d)
GO
1 голос
/ 24 мая 2011

Я не могу воспроизвести эту проблему на SQL 2008 R2, используя:

Declare @table table ( fielda varchar(10) )

Insert  Into @table ( fielda )
Values  ( Substring('12345678901234567890', 1, 10) )

Пожалуйста, убедитесь, что ваше поле действительно определено как varchar (255).

Я также настоятельно предлагаю использовать оператор вставки с явным списком полей. Хотя ваша вставка синтаксически верна, вы действительно должны использовать явный список полей (как в моем примере). Проблема заключается в том, что если вы не указываете список полей, вы находитесь в зависимости от SQL и определения таблицы для порядка полей. Когда вы делаете использование списка полей, вы можете изменить порядок полей в таблице (или добавить новые поля в середине) и не заботиться о ваших операторах вставки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...