我正在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。
我不知道为什么...并且希望获得帮助
答案 0 :(得分:2)
我想你想要
SELECT T.*
FROM Table T
WHERE T.CLIENTID = @CLIENTID AND
(@CONTRACTID IS NULL OR T.CONTRACTID = @CONTRACTID)
如果@CONTRACTID
为NULL
,它将返回客户的所有合同。如果不是NULL
,它将仅返回指定的合同。
事实并非如此:
T.CONTRACTID = ISNULL(@CONTRACTID, T.CONTRACTID)
建议T.CONTRACTID
可以是NULL
。那是唯一不等于自身的值。