如何比较存储过程中的TargetRowCount?

How to compare TargetRowCount in Stored Procedure?

我没有 SQL 背景,所以我需要一个非常明确的答案。我每天都在 .net 中构建界面,有时使用简单的语句从 SQL 中提取数据。我以前从未与商店程序有任何关系。我们的开发人员(每月休假)和我们的 DBA(因不可预见的未来而生病)都不在,并且是唯一至少看到 SQL 服务器的人,我最终更换了他们两个。我感到非常不知所措,办公室里也没有人可以问。我的老板在成为老板之前曾经是一名 SQL 开发人员并且不再从事技术工作,但今天坚持认为这个存储过程存在问题并且我要修复它。我真的不知道该怎么做。 C# 简单多了...

这个(显然是错误的)存储过程旨在填充一个新字段 - 序列。它旨在获取一个 ClientID,然后更新该 ClientID 的用户记录。如果更新记录的数量与预期的更新数量不同,则事务应该回滚。

老板说这个程序写错了。能否请您帮助我更正它,以便我可以利用我有限的 SQL 知识使用它?

DECLARE @TargetRowCount INT

SELECT @TargetRowCount = COUNT(*)  
FROM dbo.Users  
WHERE ClientId = @ClientId  
            AND Sequence <> UPPER(Name)
BEGIN TRAN

UPDATE dbo.Users
SET Sequence = UPPER(Name)


SELECT COUNT(*)  
FROM dbo.Users  
WHERE ClientId = @ClientId  
            AND Sequence <> UPPER(Name)

IF(@@RowCount <> @TargetRowCount)  
            ROLLBACK TRAN  
ELSE  
            COMMIT TRAN

提前致谢!

我很难理解该脚本的用途,但无论如何。 查看我包含的评论。希望对你有帮助:

DECLARE @TargetRowCount INT;
DECLARE @ChckRC1 INT;
DECLARE @ChckRC2 INT;

-- select how many rows with wrong name exist    
SELECT @TargetRowCount = COUNT(*)  
FROM dbo.Users  
WHERE ClientId = @ClientId  
  AND Sequence <> UPPER(Name)

BEGIN TRAN

-- update users sequence, but really all? 
UPDATE dbo.Users
SET Sequence = UPPER(Name)
-- i'd add the where clause from above
WHERE ClientId = @ClientId  
  AND Sequence <> UPPER(Name);

-- store how many rows the update hit
SET @ChckRC1 = @@ROWCOUNT;

-- select again how many rows with wrong name exist    
SELECT @ChckRC2 = COUNT(*)  
FROM dbo.Users  
WHERE ClientId = @ClientId  
  AND Sequence <> UPPER(Name);

-- first count is different than actually updated rows, 
-- some disappeared or new appeared. 
IF (@ChckRC1 <> @TargetRowCount ) 
-- second count should be zero
-- any other value suggest, there is still a user with wrong sequence
OR (@ChckRC2 <> 0 )
            ROLLBACK TRAN  
ELSE  
            COMMIT TRAN

我不知道你为什么要检查 3 次计数。我要做的是:

-- update users sequence of some client with wrong sequence
UPDATE dbo.Users
SET Sequence = UPPER(Name)
WHERE ClientId = @ClientId  
  AND Sequence <> UPPER(Name);

return @@ROWCOUNT;