0

我有一个执行如下命令的 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是 null (或者我们可以使用一些任意的固定值),我想忽略额外的限制(我希望它像第一个语句一样起作用)。

我知道我可以使用 T-SQLIF子句将两个语句放在同一个过程中,但是 SP 中已经有很多这样的语句,我担心这个存储过程会变得越来越大。

有没有办法使这项工作?

4

1 回答 1

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

于 2013-07-20T09:37:19.670 回答