У меня есть этот кусок кода в моих процедурах:sp_executesql ничего не возвращает, если параметр является нулевым
SET @Sql = 'SELECT @Value = ' + @Column + ' FROM #inserted'
exec sp_executesql @Sql, N'@Value varchar(MAX) out', @NEW out
SET @Sql = 'SELECT @Value = ' + @Column + ' FROM #deleted'
exec sp_executesql @Sql, N'@Value varchar(MAX) out', @OLD out
И когда значение столбца равно нулю переменная @OLD
не не имеет ничего, и по какой-то причине, когда я сравнить 2 переменные:
IF @NEW != @OLD
это не попасть внутрь IF
, даже если @OLD
пуст и @NEW
нет. Я пробовал:
IF @OLD is null or datalength(@OLD)=0 or @NEW != @OLD
Но все же никакого хорошего результата. Когда я печатаю 2 переменные, @OLD
ничего не печатает (в тех случаях, когда в таблице нет нуля).
Вы можете мне помочь?
Спасибо :)
EDIT
Это триггер, который я построил для некоторых таблиц в моей базе данных, когда они обновляются, так что я могу сохранить изменения. Чтобы было легко, я создал цикл через имя столбца этой таблицы, и для каждого столбца я делаю этот фрагмент кода, чтобы он дал мне проблемы. Вот немного больше моего триггера:
WHILE(@LoopCounter <= @MAX)
BEGIN
SELECT @Column = COLUMN_NAME, @Type = DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS WHERE ORDINAL_POSITION = @LoopCounter and TABLE_NAME = 'Parameters'
SET @Sql = 'SELECT @Value = ' + @Column + ' FROM #inserted'
exec sp_executesql @Sql, N'@Value varchar(MAX) out', @NEW out
SET @Sql = 'SELECT @Value = ' + @Column + ' FROM #deleted'
exec sp_executesql @Sql, N'@Value varchar(MAX) out', @OLD out
IF @OLD is null or datalength(@OLD)=0 or @NEW != @OLD
BEGIN
/* some code */
END
SET @LoopCounter = @LoopCounter + 1
END
Почему вы используете динамический sql, как это внутри триггера? Это большой красный флаг того, что не происходит внутри вашего триггера. Возможно, переработка триггера - лучший подход. Можете ли вы опубликовать весь триггер? –
У вас есть тег 'triggers', вопрос о котором этот код выполняется из триггера? –
@SeanLange см. Мое обновление к вопросу. – patricia