【问题标题】:SQL Server Stored procedure returning an unexpected valueSQL Server 存储过程返回意外值
【发布时间】:2018-04-03 23:21:56
【问题描述】:

我在 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:

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

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

【问题讨论】:

  • 不相关,但不能将 -1 分配给 tinyint 变量。您需要使用 smallint 或更大。

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


【解决方案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

【讨论】:

    【解决方案2】:

    第一次访问时需要将@@ROWCOUNT 保存到变量中,因为@@ROWCOUNT refers to the last statement。在您的 ELSE 案例中,@@ROWCOUNT 返回 0,因为您的最后一条语句是您的 IF 语句中的 @@ROWCOUNT

    【讨论】:

      【解决方案3】:
       DECLARE @Count INT
       SELECT @AccessTime=Hour
       FROM   Entries                                                                       
       WHERE  DeptId=@DeptId
       SET @Count = @@ROWCOUNT
      

      并使用变量

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

      【讨论】:

        猜你喜欢
        • 2010-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多