代码之家  ›  专栏  ›  技术社区  ›  Willy

SQL Server存储过程返回意外值

  •  0
  • Willy  · 技术社区  · 7 年前

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

    @intError 根据我的存储过程,在这种情况下应该返回到-1,但我不知道为什么,在这种情况下的存储过程(当select返回超过1行时)在输出参数中返回0 @intError公司 . 为什么?

    3 回复  |  直到 7 年前
        1
  •  2
  •   Stanislav Kundii    7 年前
     DECLARE @Count INT
     SELECT @AccessTime=Hour
     FROM   Entries                                                                       
     WHERE  DeptId=@DeptId
     SET @Count = @@ROWCOUNT
    

    并使用变量

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

        2
  •  1
  •   diiN__________    7 年前

    @@ROWCOUNT 第一次访问变量时,因为 refers to the last statement . 在你的 ELSE 案例 @@行计数 返回0,因为上一条语句是 @@行计数 在你的 IF 陈述

        3
  •  1
  •   PeterO    7 年前

    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