【问题标题】:SQL Server: use Case statement for variable declarationSQL Server:用于变量声明的用例语句
【发布时间】:2014-06-13 01:59:16
【问题描述】:

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

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

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

SQL 中有什么方法可以使用 Case 或 If 语句或其他变量声明将最后一个变量设置为 @searchTerm datetime if @searchCategory = "dateRec" 并且仅适用于所有其他情况如上@searchTerm nvarchar(256)

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

【问题讨论】:

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


    【解决方案1】:

    您应该使用datetime 类型的附加变量,然后使用CASEIFWHERE 中的条件集来 选择使用哪个变量。

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

    【讨论】:

    • 谢谢。我试试看。
    【解决方案2】:

    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
    

    【讨论】:

    • 也谢谢你!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    • 1970-01-01
    • 2011-02-26
    相关资源
    最近更新 更多