SQL存储过程(如果(@variable=0)不起作用
我创建了一个带有一些变量和嵌套if语句的存储过程。 当我从程序中调用存储过程并检查返回的数据集的返回值时,我的数据集是空的,而其中应该有记录。在一些测试之后,我注意到当@PoolID=0语句被测试并且@PoolID为0时,它不会通过if语句。。。因此,每当我在代码中将变量poolid设置为0时,我就会从else语句中得到结果 谁知道出了什么问题? ThxSQL存储过程(如果(@variable=0)不起作用,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我创建了一个带有一些变量和嵌套if语句的存储过程。 当我从程序中调用存储过程并检查返回的数据集的返回值时,我的数据集是空的,而其中应该有记录。在一些测试之后,我注意到当@PoolID=0语句被测试并且@PoolID为0时,它不会通过if语句。。。因此,每当我在代码中将变量poolid设置为0时,我就会从else语句中得到结果 谁知道出了什么问题? Thx 您可以将其重写为一个由4部分组成的UNION ALL的单选部分 我还注意到你的情况并不全面,不确定这是否是故意的 在@PoolID=0的第二个
您可以将其重写为一个由4部分组成的UNION ALL的单选部分 我还注意到你的情况并不全面,不确定这是否是故意的 在@PoolID=0的第二个分支中,测试特别是@Bevoegdheid<3和@Bevoegdheid>=3,而不是在@Bevoegdheid为NULL时不起作用的ELSE
优化器将只运行符合标记为的条件的分支。您确定@PoolID为零吗?如果您在SSMS中运行它,您会得到预期的结果吗?您是否尝试运行SQL Server Profiler以查看实际发送到过程中的内容?@Ben您确定您在同一数据库上运行吗?您可以发布如何调用此sp吗?我怀疑问题在于您在调用代码中设置了PoolId变量。@Martin-no,这里没有可用的实例,但是这里有一个完整的讨论,并提供了很好的解释来支持您。自2005年以来,这些分支可能会得到计划,但它们仍然没有使测试变得更容易——并且将所有条件保留在应用程序中它们所属的位置。谢谢你的代码,这比我的代码好。我的问题是,我没有按照存储过程中变量的顺序传递变量。真奇怪。。。
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[Pool_select]
@PartnerCode nvarchar(8),
@GebrID int,
@PoolID int,
@Bevoegdheid int
AS
IF (@PoolID = 0)
BEGIN
IF (@Bevoegdheid < 3)
BEGIN
SELECT
p.*,
pr.poolrecht
FROM racpPool p, racpPoolrecht pr
WHERE
p.poolid = pr.poolid and
p.PartnerCode = @PartnerCode and
pr.poolrecht > 0 and
p.actief = 1 and
pr.GebrID = @GebrID
END
ELSE
BEGIN
SELECT *
FROM racpPool p
WHERE standaardpool = 1
and partnercode = @PartnerCode
END
END
ELSE
BEGIN
IF (@Bevoegdheid < 3)
BEGIN
SELECT
p.*,
pr.poolrecht
FROM racpPool p, racpPoolrecht pr
WHERE
p.poolid = pr.poolid and
p.PartnerCode = @PartnerCode and
pr.poolrecht > 0 and
p.actief = 1 and
pr.GebrID = @GebrID and
p.PoolID = @PoolID
END
ELSE IF (@Bevoegdheid >= 3)
BEGIN
SELECT *
FROM racpPool p
WHERE PoolID = @PoolID
END
END
ALTER PROCEDURE [dbo].[Pool_select]
@PartnerCode nvarchar(8),
@GebrID int,
@PoolID int,
@Bevoegdheid int
-- WITH RECOMPILE -- << may need this
AS
SELECT
p.*,
pr.poolrecht
FROM racpPool p, racpPoolrecht pr
WHERE
p.poolid = pr.poolid and
p.PartnerCode = @PartnerCode and
pr.poolrecht > 0 and
p.actief = 1 and
pr.GebrID = @GebrID
AND @PoolID = 0 and @Bevoegdheid < 3 --- <<<
UNION ALL
SELECT *, NULL
FROM racpPool p
WHERE standaardpool = 1
and partnercode = @PartnerCode
AND @PoolID = 0 and IsNull(@Bevoegdheid,4) >= 3 --- <<<
UNION ALL
SELECT
p.*,
pr.poolrecht
FROM racpPool p, racpPoolrecht pr
WHERE
p.poolid = pr.poolid and
p.PartnerCode = @PartnerCode and
pr.poolrecht > 0 and
p.actief = 1 and
pr.GebrID = @GebrID and
p.PoolID = @PoolID
AND Isnull(@PoolID,-1) <> 0 AND @Bevoegdheid < 3 --- <<<
UNION ALL
SELECT *, NULL
FROM racpPool p
WHERE PoolID = @PoolID
AND Isnull(@PoolID,-1) <> 0 AND @Bevoegdheid >= 3 --- <<<