对于某些 SQL 查询,我知道必须受 UPDATE、DELETE 或 INSERT 语句影响的预期行数。它可以是一个数字,例如 1,也可以是一个范围,例如 0-1 或 1-2 等。
强制这是受影响的行数并且否则抛出异常的最佳方法是什么?
另外,我可以将 UPDATE/DELETE/INSERT 影响的行数限制为 1 行,否则会出现异常?
谢谢
对于某些 SQL 查询,我知道必须受 UPDATE、DELETE 或 INSERT 语句影响的预期行数。它可以是一个数字,例如 1,也可以是一个范围,例如 0-1 或 1-2 等。
强制这是受影响的行数并且否则抛出异常的最佳方法是什么?
另外,我可以将 UPDATE/DELETE/INSERT 影响的行数限制为 1 行,否则会出现异常?
谢谢
您可以在插入、更新和删除中使用 TOP 来强制受影响的行数。没有例外。
declare @T table (id int)
insert top(1) into @T values
(1),
(2),
(3)
如果你想要例外,你可以@@ROWCOUNT
在事务中使用。
declare @Min int = 2
declare @Max int = 3
begin transaction
insert into Table1 values
(1),
(2),
(3),
(4)
if not @@rowcount between @Min and @Max
begin
rollback
-- Throw exception here, RAISERROR()
end
else
begin
commit
end
对于 UPDATE、INSERT 和 DELETE 语句,ExecuteNonQuery 返回受命令影响的行数。
我建议您将调用包装在事务中,如果结果不符合预期,则回滚事务并引发异常。
您也可以使用@@ROWCOUNT在查询中执行相同的操作。
在您的语句之后直接使用@@ROWCOUNT 。 如果不等于您想要的,请使用RAISERROR。
然而,一个小警告,RAISERROR 有一个严重性参数。使用 11 到 19 之间的数字。低于 11 被视为警告。高于 19 只能由系统管理员完成,这是一个致命错误并终止您的连接。
我认为在查询级别,要使用的东西要么是过程内的@@ROWCOUNT,要么是外部的类似,但你需要使用事务。
如果您想在数据库中降低一点(因为上述技术只会保护旨在使用此类框架的查询),那么您可以在表上使用触发器并获取 INSERTED 或 DELETED 伪表的计数并使用 RAISERRROR提出适当的错误。