我有一个带有以下输入变量的动态过程:
@selection nvarchar(20),
@searchCategory nvarchar(100) = '',
@searchTerm nvarchar(256) = ''
一般程序按预期工作 - 除以下情况外:
如果searchCategory是" dateRec
"那么searchTerm格式将是一个日期,相应的列将是日期时间,而对于其他所有格式,它们都是nvarchar。
如果@searchCategory =" @searchTerm datetime
&,我可以在SQL中使用Case或If语句或变量声明的其他方法将最后一个变量设置为dateRec
#34;并且仅针对所有其他情况将其设置为@searchTerm nvarchar(256)
,如上所述?
非常感谢你提供任何帮助,蒂姆。
答案 0 :(得分:2)
您应该使用datetime
类型的其他变量,然后在CASE
中使用IF
,WHERE
或一组条件来使用
选择使用哪个变量。
@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