Transact-SQL中,即使重新宣告,迴圈中的資料表變數也不會清空

這是我在debug時發現的。假設以下SQL:

DECLARE @i int;
set @i=0;

WHILE @i < 10
BEGIN
    DECLARE @t TABLE ( No int );
    INSERT @t ( No ) VALUES ( @i );

    IF @i = 9
    BEGIN
        SELECT * FROM @t;
    END

    SET @i = @i+1;
END

就寫程式的思維,最後的輸出結果應該是只有一筆No為9的資料,但實際執行結果卻會有10筆資料。

No
———–
0
1
2
3
4
5
6
7
8
9

所以,在迴圈內,一開始記得要清空資料表變數的內容,才不會得到詭異的結果。如下:

DECLARE @i int;
set @i=0;

WHILE @i < 10
BEGIN
    DECLARE @t TABLE ( No int );
    DELETE FROM @t;

    INSERT @t ( No ) VALUES ( @i );

    IF @i = 9
    BEGIN
        SELECT * FROM @t;
    END

    SET @i = @i+1;
END