SQL Server:可选参数行为逻辑

时间:2019-07-05 23:00:24

标签: sql sql-server tsql stored-procedures sqlparameters

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

这是一些示例代码...

CREATE PROCEDURE SP_EXAMPLE_STACKOVERFLOW
    @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。

我不知道为什么...并且希望获得帮助

1 个答案:

答案 0 :(得分:2)

我想你想要

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

如果@CONTRACTIDNULL,它将返回客户的所有合同。如果不是NULL,它将仅返回指定的合同。

事实并非如此:

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

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