7

以下は私が持っているSQLスクリプトの簡略版です。print @RowNum最初の結果セットの実際のレコード番号ではなく、常に0を表示します。どうしたの?ありがとうございました。

declare @i int, @RowNum int
set @i=0
while @i<2
begin
    execute StoredProcedure @i --containing a big select
    if @i=0 set @RowNum=@@rowcount
    set @i=@i+1
end
print @RowNum
4

3 に答える 3

14

これはif @i=0

それを0に設定し、printステートメントでも0に設定します

今これを実行します

declare @i int, @RowNum int
set @i=0
while @i<2
begin
    if @i=0
    begin   
        execute StoredProcedure @i --containing a big select
        set @RowNum=@@rowcount
    end
    else
    execute StoredProcedure @i 
    set @i=@i+1
end
print @RowNum

これは別の例です

select 1
union all
select 2

select @@rowcount --2
go

今は0になります

select 1
union all
select 2
if 1=1
select @@rowcount --0

PRINTもそれを台無しにします、これは2になります

select 1
union all
select 2

select @@rowcount --2
go

これは0になります

select 1
union all
select 2

print '1'
select @@rowcount -- 0

ここに、より多くの例と説明を含む投稿を作成しました。@@ ROWCOUNTを変数に格納する必要があるのはいつですか?

于 2010-08-26T14:04:23.453 に答える
0

SQLMenaceの答えは正しいと思いますが、「これであなたが望むことをしませんか?」と付け加えます。

    declare @RowNum int 
    execute StoredProcedure 0
    set @RowNum=@@rowcount 
    execute StoredProcedure 1 
    print @RowNum 
于 2010-08-26T14:08:22.263 に答える
0

私は一般的にこのスタイルを避けます。プロシージャの呼び出し後に@@rowcountをクエリして、SPのテーブルから選択された行数を取得すると、実際には、プロシージャが内部でどのように実装されるかに不必要な依存関係が生じ、明示性が損なわれます。後でプロシージャの実装を変更すると、外部のコードが破損する可能性があり、SPの変更中には明らかではありません。代わりに、適切な名前の出力パラメーターを使用する必要があります。

于 2010-08-27T05:58:44.990 に答える