SQL Server:在Where子句中使用Case语句会产生错误

时间:2014-06-25 15:21:37

标签: sql sql-server datetime stored-procedures dynamic

我有一个动态过程,其中输入变量可以是一个日期,相应的列被格式化为datetime,或者一个字符串,相应的列被格式化为nvarchar。

如果输入是日期,那么这看起来像yyyy-mm-dd。

为了解决这个问题我尝试将以下内容添加到我的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 个答案:

答案 0 :(得分:1)

您无法将日期时间值放入字符串中。首先将其转换为datetime,然后将其转换为您想要的格式,然后转换为Varchar,以便它可以成为动态字符串的一部分。

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

或者如果@searchTerm已经采用您想要的格式,那么您就不需要将其投射

 (A.dateX = @searchTerm)