T-SQL: условная установка переменной - PullRequest
1 голос
/ 23 сентября 2019

Каков правильный синтаксис для условной установки переменной T-SQL из оператора select?

У меня есть код, подобный следующему:

select @CreationDate = dm.TS_UP
     , @RegenerateDocument = dm.REGENERATEBLOB
     , @CalculateRelativeToDate = case
                                    when dm.REGENERATEBLOB is null then getdate()
                                    when dm.REGENERATEBLOB = 'Y' then getdate()
                                    when dm.REGENERATEBLOB = 'N' then coalesce(@ApprovalDate, getdate())
                                  end
  from doc_mgmt dm
 where dm.ID_DOC = '11123'
   and dm.ID_PRMRY_TYPE = @CID
   and dm.ID_WRK_TYPE = @IID

Обратите внимание, что нетветвей в случае заканчиваются на null.

Но у меня возникли некоторые проблемы с переменной @CalculateRelativeToDate, которая иногда выглядит как null.Я не понимаю, почему это будет.На самом деле, в случае, когда я тестирую, флаг @RegenerateDocument установлен на Y, поэтому я думаю, что ДОЛЖЕН получить getdate().Но я получаю null.

Каков правильный синтаксис для условной установки переменной T-SQL из оператора select?

1 Ответ

2 голосов
/ 23 сентября 2019

Если вы хотите убедиться, что значения установлены, вы можете использовать агрегирование.Запрос агрегации без group by всегда возвращает ровно одну строку:

select @CreationDate = max(dm.TS_UP),
       @RegenerateDocument = max(dm.REGENERATEBLOB),
       @CalculateRelativeToDate = (case when max(dm.REGENERATEBLOB) is null then getdate()
                                        when max(dm.REGENERATEBLOB) = 'Y' then getdate()
                                        when max(dm.REGENERATEBLOB) = 'N' then coalesce(@ApprovalDate, getdate())
                                   end)
from doc_mgmt dm
where dm.ID_DOC = '11123' and
      dm.ID_PRMRY_TYPE = @CID and
      dm.ID_WRK_TYPE = @IID;

Если вы обычно ожидаете одну строку, проблем нет.max() вернет значение из этой строки.Если ни одна строка не совпадает, тогда значения max() будут NULL - что, по-видимому, соответствует ожиданиям.

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