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を使用してください。

ただし、小さな警告が 1 つあります。RAISERROR には重大度パラメータがあります。11 から 19 までの数値を使用してください。11 未満は警告と見なされます。19 以上はシステム管理者のみが実行でき、致命的なエラーであり、接続を終了します。

于 2011-02-17T10:18:43.927 に答える
0

クエリレベルでは、使用するのはプロシージャ内の @@ROWCOUNT または同様の外部のいずれかですが、トランザクションを使用する必要があります。

データベースをもう少し低くしたい場合 (上記の手法は、そのようなフレームワークを使用するように設計されたクエリのみを保護するため)、テーブルでトリガーを使用し、INSERTED または DELETED 疑似テーブルのカウントを取得し、RAISERRROR を使用できます。適切なエラーを発生させます。

于 2011-02-17T10:35:38.360 に答える