7

while ループ内のテーブル変数が他の変数のように動作しない理由を知りたいです。テーブル変数は一度だけ作成され、ループ全体で使用されます。ただし、ループが増加するたびに他の変数が初期化されます。

詳細については、以下のコードを確認してください

declare @tt int
set @tt =10
while @tt>0
begin

        declare @temptable table(id int identity(1,1),sid bigint)
        insert into @temptable 
                select @tt union all
                select @tt + 1 

                select * from @temptable 
               --delete from @temptable
                set @tt=@tt-1
end

これはバグですか??

4

4 に答える 4

5

あなたの前提は間違っています。他の変数は、declare ステートメントに遭遇するたびに再初期化されることもありません。

set nocount on

declare @tt int
set @tt =10
while @tt>0
begin

        declare @i int

        set @i = isnull(@i,0) + 1
        print @i
        set @tt=@tt-1

end

版画

1
2
...
9
10
于 2010-09-20T11:46:44.380 に答える
4

予想通り

SQL Server 変数のスコープは、ブラック/ネストされたコンストラクトごとではなく、バッチごとまたは関数/プロシージャ/トリガー全体です

http://msdn.microsoft.com/en-us/library/ms187953.aspx :

変数のスコープは、変数を参照できる Transact-SQL ステートメントの範囲です。変数のスコープは、変数が宣言された時点から、変数が宣言されたバッチまたはストアド プロシージャの最後まで続きます。

于 2010-09-20T11:50:39.600 に答える
-1

ループが実行されるたびにテーブル変数をロードする場合。ループ内で作業が完了したら、DROP FROM @Tablevariable。

于 2017-05-24T23:53:30.137 に答える