SQL Server存储过程返回意外值

时间:2017-10-23 12:02:30

标签: c# sql-server sql-server-2008 stored-procedures sql-server-2008-r2

我在SQL Server 2008中有这个从C#代码调用的存储过程:

CREATE PROCEDURE [dbo].[DepartmentStoreControlAccess]              
    @DeptId INT,             
    @intError tinyint OUTPUT,
AS
    SET @intError = 0

    SELECT @AccessTime = Hour
    FROM Entries
    WHERE DeptId = @DeptId

    IF @@ROWCOUNT = 1
    BEGIN
        -- DO STUFF and update @intError
    END
    ELSE
    BEGIN
        IF @@ROWCOUNT = 0   
            SET @intError = 0
        ELSE
            SET @intError = -1 
    END

有一个案例我肯定知道选择:

SELECT @AccessTime = Hour
FROM Entries
WHERE DeptId = @DeptId

可以返回多于1行,比方说2,3,4,....,N所以输出参数@intError应该返回-1,在这种情况下根据我的存储过程,但我不知道原因,这种情况下的存储过程(当select返回多于1行时)在输出参数@intError中返回0。为什么呢?

3 个答案:

答案 0 :(得分:2)

 DECLARE @Count INT
 SELECT @AccessTime=Hour
 FROM   Entries                                                                       
 WHERE  DeptId=@DeptId
 SET @Count = @@ROWCOUNT

并使用变量

  

返回受最后一个语句影响的行数。

答案 1 :(得分:1)

首次访问变量时,您需要将@@ROWCOUNT保存到变量中,因为@@ROWCOUNT refers to the last statement。在ELSE案例中,@@ROWCOUNT返回0,因为您的上一个陈述是@@ROWCOUNT声明中的IF

答案 2 :(得分:1)

原因是检查@@ ROWCOUNT会重置@@ ROWCOUNT

中的值
IF @@ROWCOUNT = 1   -- From this point @@ROWCOUNT = 0
BEGIN
    -- DO STUFF and update @intError
END
ELSE
BEGIN
    if @@ROWCOUNT = 0   -- So we always end up here
        set @intError = 0
    else
        set @intError = -1 
END