SQL Server:使用Case语句进行变量声明

时间:2014-06-12 17:33:11

标签: sql sql-server stored-procedures if-statement case

我有一个带有以下输入变量的动态过程:

@selection nvarchar(20),
@searchCategory nvarchar(100) = '',
@searchTerm nvarchar(256) = '' 

一般程序按预期工作 - 除以下情况外: 如果searchCategory是" dateRec"那么searchTerm格式将是一个日期,相应的列将是日期时间,而对于其他所有格式,它们都是nvarchar。

如果@searchCategory =" @searchTerm datetime&,我可以在SQL中使用Case或If语句或变量声明的其他方法将最后一个变量设置为dateRec #34;并且仅针对所有其他情况将其设置为@searchTerm nvarchar(256),如上所述?

非常感谢你提供任何帮助,蒂姆。

2 个答案:

答案 0 :(得分:2)

您应该使用datetime类型的其他变量,然后在CASE中使用IFWHERE或一组条件来使用  选择使用哪个变量。

@selection nvarchar(20),
@searchCategory nvarchar(100) = '',
@searchTerm nvarchar(256) = '',
@searchTerm2 datetime = ''

答案 1 :(得分:1)

1)如果您无法更改该存储过程的参数,那么您可以使用两个具有正确数据类型的局部变量:

...
DECLARE @localSearchTermDT DATETIME,
    @localSearchTermCHR NVARCHAR(256);

IF @searchCategory = 'dateRec'
    SET @localSearchTermDT = CONVERT(DATETIME, @searchTerm, ...)
ELSE
    SET @localSearchTermCHR = @searchTerm;

注意:此解决方案将阻止参数嗅探。

2)另一种解决方案是使用CAST / CONVERT:

...
Column1DT = CASE WHEN @searchCategory = 'dateRec' THEN CONVERT(DATETIME, @searchTerm, ...) END
...
Column2CHR = CASE WHEN @searchCategory <> 'dateRec' THEN @searchTerm END