Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL存储过程(如果(@variable=0)不起作用_Sql_Sql Server_Stored Procedures - Fatal编程技术网

SQL存储过程(如果(@variable=0)不起作用

SQL存储过程(如果(@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的第二个

我创建了一个带有一些变量和嵌套if语句的存储过程。 当我从程序中调用存储过程并检查返回的数据集的返回值时,我的数据集是空的,而其中应该有记录。在一些测试之后,我注意到当@PoolID=0语句被测试并且@PoolID为0时,它不会通过if语句。。。因此,每当我在代码中将变量poolid设置为0时,我就会从else语句中得到结果

谁知道出了什么问题? Thx


您可以将其重写为一个由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  --- <<<