我在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。为什么呢?
答案 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