一部の 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 または同様の外部のいずれかですが、トランザクションを使用する必要があります。
データベースをもう少し低くしたい場合 (上記の手法は、そのようなフレームワークを使用するように設計されたクエリのみを保護するため)、テーブルでトリガーを使用し、INSERTED または DELETED 疑似テーブルのカウントを取得し、RAISERRROR を使用できます。適切なエラーを発生させます。