3

对于某些 SQL 查询,我知道必须受 UPDATE、DELETE 或 INSERT 语句影响的预期行数。它可以是一个数字,例如 1,也可以是一个范围,例如 0-1 或 1-2 等。

强制这是受影响的行数并且否则抛出异常的最佳方法是什么?

另外,我可以将 UPDATE/DELETE/INSERT 影响的行数限制为 1 行,否则会出现异常?

谢谢

4

4 回答 4

5

您可以在插入、更新和删除中使用 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  
于 2011-02-17T10:22:13.503 回答
2

对于 UPDATE、INSERT 和 DELETE 语句,ExecuteNonQuery 返回受命令影响的行数。

我建议您将调用包装在事务中,如果结果不符合预期,则回滚事务并引发异常。

您也可以使用@@ROWCOUNT在查询中执行相同的操作。

于 2011-02-17T10:14:40.093 回答
2

在您的语句之后直接使用@@ROWCOUNT 。 如果不等于您想要的,请使用RAISERROR

然而,一个小警告,RAISERROR 有一个严重性参数。使用 11 到 19 之间的数字。低于 11 被视为警告。高于 19 只能由系统管理员完成,这是一个致命错误并终止您的连接。

于 2011-02-17T10:18:43.927 回答
0

我认为在查询级别,要使用的东西要么是过程内的@@ROWCOUNT,要么是外部的类似,但你需要使用事务。

如果您想在数据库中降低一点(因为上述技术只会保护旨在使用此类框架的查询),那么您可以在表上使用触发器并获取 INSERTED 或 DELETED 伪表的计数并使用 RAISERRROR提出适当的错误。

于 2011-02-17T10:35:38.360 回答