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)
如果 @CONTRACTID
是 NULL
,这将为客户 return 所有合同。如果不是 NULL
.
,它将仅 return 指定的合约
这没有按预期工作的事实:
T.CONTRACTID = ISNULL(@CONTRACTID, T.CONTRACTID)
建议 T.CONTRACTID
可以是 NULL
。这是唯一不等于自身的值。
我正在 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)
如果 @CONTRACTID
是 NULL
,这将为客户 return 所有合同。如果不是 NULL
.
这没有按预期工作的事实:
T.CONTRACTID = ISNULL(@CONTRACTID, T.CONTRACTID)
建议 T.CONTRACTID
可以是 NULL
。这是唯一不等于自身的值。