3

ASP.NET C# プログラムから次の SQL ステートメント ブロックを使用しています。

SET XACT_ABORT ON;  --Need to roll back upon failure
BEGIN TRANSACTION;  --Need to be performed atomically
UPDATE MyTable SET Col1='SomeValue' WHERE ColID='N';
DELETE FROM MyTable WHERE ColID='X';
COMMIT;
SET XACT_ABORT OFF;

上記の SQL ブロックは、次を返す必要があるSqlCommand.ExecuteNonQuery メソッドを呼び出すことによって一度に実行されます。

UPDATE、INSERT、および DELETE ステートメントの場合、戻り値はコマンドの影響を受けた行数です。

しかし、ExecuteNonQuery() から戻ったときに得られるのは、削除されたレコードの数に追加された更新されたレコードの数です。だから私の質問は、どうにかして削除されたレコードの数だけを返すようにすることはできますか?

4

2 に答える 2

3

ストアド プロシージャの先頭にあるこの 1 行のコード SET NOCOUNT ON は、各 T-SQL ステートメントの実行後に SQL Server がクライアントに送り返すメッセージをオフにします。これは、すべての SELECT、INSERT、UPDATE、および DELETE ステートメントに対して実行されます。

この余分なオーバーヘッドをネットワークから取り除くことで、データベースとアプリケーションの全体的なパフォーマンスを大幅に改善できます。

実行中の T-SQL ステートメントの影響を受ける行数を取得する必要がある場合でも、@@ROWCOUNT オプションを使用できます。SET NOCOUNT ON を発行することにより、この関数 (@@ROWCOUNT) は引き続き機能し、ステートメントによって影響を受けた行数を識別するためにストアド プロシージャで引き続き使用できます。

SET NOCOUNT ON 
SET XACT_ABORT ON;  --Need to roll back upon failure
BEGIN TRANSACTION;  --Need to be performed atomically
UPDATE MyTable SET Col1='SomeValue' WHERE ColID='N';
SET NOCOUNT OFF
DELETE FROM MyTable WHERE ColID='X';
COMMIT;
SET XACT_ABORT OFF;
于 2012-04-30T10:52:17.827 に答える
0

OK、答えが見つかりました。明らかにそのように呼び出すと、最初の ROWCOUNT_BIG() の行カウンターがリセットされ、2 番目の呼び出しは削除された数を返します。

SET XACT_ABORT ON;  --Need to roll back upon failure
BEGIN TRANSACTION;  --Need to be performed atomically
UPDATE MyTable SET Col1='SomeValue' WHERE ColID='N';
SELECT ROWCOUNT_BIG();   --resets rowcount
DELETE FROM MyTable WHERE ColID='X';
SELECT ROWCOUNT_BIG();   --retrieves the needed row count
COMMIT;
SET XACT_ABORT OFF;
于 2012-04-30T05:03:15.867 に答える