使用Nullable Int缩短SQL Server存储过程

时间:2013-07-20 09:22:09

标签: sql-server tsql

我有一个SQL Server存储过程,它执行如下命令:

SELECT TOP(25) 
     col_charname, col_axexp 
FROM 
     tbl_characters
WHERE 
     GETUTCDATE() < DATEADD(DAY, 30, col_lastlogin)
ORDER BY 
     col_axexp DESC

我想允许存储过程有选择地为WHERE指定另一个限制。与参数@par_vocation进行整数比较。

SELECT TOP(25) 
    col_charname, col_axexp 
FROM 
    tbl_characters
WHERE 
    GETUTCDATE() < DATEADD(DAY,30, col_lastlogin) 
    AND col_vocation = @par_vocation
ORDER BY 
    col_axexp DESC

但是,如果@par_vocation为空(或者我们可能使用一些任意的固定值),我想忽略额外的限制(我希望它像第一个语句一样运行)。

我知道我可以使用T-SQL IF子句在同一个过程中同时使用这两个语句,但SP中已有很多这些语句,我担心这个存储过程会变大

有没有办法让这项工作?

1 个答案:

答案 0 :(得分:0)

有很多方法可以做到这一点,例如:

SELECT TOP(25) 
    col_charname, col_axexp 
FROM 
    tbl_characters
WHERE 
    GETUTCDATE() < DATEADD(DAY,30, col_lastlogin) 
    AND col_vocation = isnull(@par_vocation, col_vocation)
ORDER BY 
    col_axexp DESC

SELECT TOP(25) 
    col_charname, col_axexp 
FROM 
    tbl_characters
WHERE 
    GETUTCDATE() < DATEADD(DAY,30, col_lastlogin) 
    AND (@par_vocation is null or col_vocation = @par_vocation)
ORDER BY 
    col_axexp DESC

但是,您应该知道这些查询的执行计划可能不仅仅适用于col_vocation = @par_vocation