SQL 服务器:可选参数行为逻辑

SQL Server : Optional Parameter Behavior Logic

我正在 SQL Server 2014 中实现一个存储过程,有两个参数:@CLIENTID@CONTRACTID。其中一个参数是可选的,因此,当存储过程仅接收客户 ID 时,它应该 return 与该客户相关的所有信息,而当它同时接收客户 ID 和合同 ID 时,它应该 [=25] =] 仅来自该特定客户的与该特定合同相关的信息。

这是一些示例代码...

CREATE PROCEDURE SP_EXAMPLE_Whosebug
    @CLIENTID INT,
    @CONTRACTID INT = NULL
AS
    SELECT
        *
    FROM 
        Table T
    WHERE 
        T.CLIENTID = @CLIENTID
        AND (T.CONTRACTID = @CONTRACTID OR ISNULL(@CONTRACTID, 0) = 0)

上面的代码有效,但是我的第一次尝试是将最后一行写成这样:

AND T.CONTRACTID = ISNULL(@CONTRACTID, T.CONTRACTID)

但是这不起作用...它基本上认为最后一行一直被评估为 FALSE。

我不明白为什么...非常感谢您的帮助

我想你想要:

SELECT T.*
FROM Table T
WHERE T.CLIENTID = @CLIENTID AND
      (@CONTRACTID IS NULL OR T.CONTRACTID = @CONTRACTID)

如果 @CONTRACTIDNULL,这将为客户 return 所有合同。如果不是 NULL.

,它将仅 return 指定的合约

这没有按预期工作的事实:

T.CONTRACTID = ISNULL(@CONTRACTID, T.CONTRACTID)

建议 T.CONTRACTID 可以是 NULL。这是唯一不等于自身的值。