SQL Server: использование инструкции Case в предложении Where создает ошибку

#sql #sql-server #datetime #stored-procedures #dynamic

#sql #sql-сервер #datetime #хранимые процедуры #динамический

Вопрос:

У меня есть динамическая процедура, в которой входной переменной может быть либо дата с соответствующим столбцом, отформатированным как datetime, ЛИБО строка с соответствующими столбцами, отформатированными как nvarchar .

Если вводом является дата, то это будет выглядеть как гггг-мм-дд .

Чтобы покрыть это, я попытался добавить следующее в свое предложение Where, но это создает приведенную ниже ошибку (если я удалю эту строку, тогда остальная часть процедуры будет работать по назначению):

 @searchTerm nvarchar(256) = ''

-- ...

WHERE           CASE WHEN '''   @searchCategory   ''' <> ''dateX'' THEN
                    (A.'   @searchCategory   ' LIKE ''%'   @searchTerm   '%'')
                    ELSE
                    (A.dateX = '''   CAST(@searchTerm AS DATETIME)   ''')
                    END

-- ...
  

Ошибка:

 Conversion failed when converting date and/or time from character string.
  

Может кто-нибудь сказать мне, что я должен изменить здесь, чтобы заставить это работать?

Заранее большое спасибо, Майк.

Ответ №1:

Вы не можете поместить значение datetime в строку. Сначала приведите его к datetime, чтобы получить его в нужном формате, затем приведите к Varchar, чтобы он мог быть частью вашей динамической строки.

 (A.dateX = '''   CAST(CAST(@searchTerm AS DATETIME) AS VARCHAR(20))   ''')
  

Или, если @searchTerm уже находится в нужном вам формате, вам не нужно его приводить

  (A.dateX = @searchTerm)
  

Комментарии:

1. Спасибо. Не уверен, что я правильно объяснил это. Итак, мой ввод — nvarchar, а мой вывод — в случае, если это дата — должен быть datetime .

2. Вы пробовали мое решение?