如何比较存储过程中的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;
我没有 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;