web-dev-qa-db-ja.com

@@ rowcountのスコープ?

_@@rowcount_のスコープは何ですか? [〜#〜] msdn [〜#〜] はそのスコープについて言及していません。

最後のステートメントの影響を受けた行の数を返します。

OK。

私のSP —私はテーブルに挿入しています。これは、新しい値がテーブルに挿入されたときにanother挿入を行う_insert trigger_を持っています。

質問:

_@@rowcount_はどのスコープを参照しますか? (トリガーまたはSP)?

28
Royi Namir

確かに、この記事はSQL Server 2000に関するものですが、バージョン間でスコープが変更されないことを願っています。記事によると トリガーがSQL Server 2000のROWCOUNTおよびIDENTITYにどのように影響するか@@ROWCOUNTはトリガーの影響を受けません。

具体的には:

ベーステーブルにトリガーがある場合でも、SQL Server 2000で@@ ROWCOUNTを使用しても安全です。トリガーは結果を歪めません。期待どおりの結果が得られます。 @@ ROWCOUNTは、NOCOUNTが設定されている場合でも正しく機能します。

したがって、3つの行を更新し、トリガーが別の場所で5つの行を更新すると、@@ROWCOUNT/3。

また、GBNの回答から SQL Server-マルチスレッドアプリケーションで@@ ROWCOUNTを使用しても安全ですか?

@@ ROWCOUNTはスコープと接続の両方で安全です。

実際、その接続とスコープの最後のステートメント行数のみを読み取ります。

20

すべての挿入/更新/選択/設定/削除ステートメントは、実行されたステートメントの影響を受ける行に@@rowcountをリセットします

begin
declare @myrowcount int,
    @myrowcount2 int
insert stmt
SET @myrowcount=@@rowcount
if @myrowcount>0
begin
insert stmt
SET @myrowcount2 =@@rowcount
if @myrowcount2 >0
do smthg
end
end

またはこれを試してください

 SELECT * FROM master.sys.objects -- 50 rows
    IF (1=1)
        SELECT @@ROWCOUNT AS RowsAffected -- 0, because the IF did not affect any rows

iF文でさえもそれに影響を与えます。そのため、そのスコープは最後に読み込まれた文です。

12
NG.