2016-07-06 3 views
0

У меня есть этот кусок кода в моих процедурах: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 
+1

Почему вы используете динамический sql, как это внутри триггера? Это большой красный флаг того, что не происходит внутри вашего триггера. Возможно, переработка триггера - лучший подход. Можете ли вы опубликовать весь триггер? –

+0

У вас есть тег 'triggers', вопрос о котором этот код выполняется из триггера? –

+0

@SeanLange см. Мое обновление к вопросу. – patricia

ответ

0

Хорошо, я нашел решение. Спасибо за ваши советы. Я изменил свой код на:

 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 ISNULL(@NEW,0) != ISNULL(@OLD,0) 

С ISNULL все идет нормально. Мне также пришлось использовать это в другом месте в моем коде, где я связывал string с значениями @OLD и @NEW.

Спасибо :)

+0

для переменных varchar? –

0

Так проверьте нулевые состояния:

IF @NEW != @OLD 
OR @NEW IS NULL AND @OLD IS NOT NULL 
OR @OLD IS NULL AND @NEW IS NOT NULL 
BEGIN 
... 
+0

Я проверил нулевые состояния, но он все еще не работает. – patricia

+0

Я не думаю, что это возможно на самом деле. –

0

Почему бы не активный ... не выполняются, если ваш @column является недействительным ..

WHILE(@LoopCounter <= @MAX) 
    BEGIN 
     SELECT @Column = COLUMN_NAME, @Type = DATA_TYPE 
     FROM INFORMATION_SCHEMA.COLUMNS WHERE ORDINAL_POSITION = @LoopCounter and TABLE_NAME = 'Parameters' 

     IF ISNULL(@Column,'')<>'' 
      BEGIN 
      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 
     END 
     SET @LoopCounter = @LoopCounter + 1 
END 
+0

Столбец не 'NULL', потому что это имя столбца таблицы. Это значение, которое может быть нулевым. – patricia

+0

ОК ... но в вашем вопросе было сказано ... "И когда значение столбца равно null, переменная @OLD не имеет ничего и по какой-то причине, когда я сравниваю две переменные:".Как упоминал Шон Ланг, вы должны опубликовать весь триггер, чтобы у нас появилась идея о том, что вы пытаетесь выполнить, и могли бы предоставить вам варианты. – Dave