1

いくつかのトランザクションを開いたり閉じたりする大きなT-SQLスクリプトがあります。GOステートメントを使用してバッチをコミットすると、そのスコープからすべての変数が効果的にクリアされることを読みました。

以下のスクリプトを考えると、トランザクションがコミットされた後に@MyImportantVariableが定義されますか?

これは問題ですか?もしそうなら、どうすればそれを克服できますか?

DECLARE @MyImportantVariable INT;
SET @MyImportantVariable = 42;

DECLARE @Counter INT;
SET @Counter = 0

DECLARE UpdateGarmentCursor CURSOR FAST_FORWARD
FOR
SELECT
        MyColumn
    FROM
        MyWonderfulTable

BEGIN TRANSACTION
    WHILE @@TRAN_STATUS = 0 
    BEGIN
        -- Do interesting work in here
    SET @Counter = @Counter +1
    IF(@Counter>10) 
    BEGIN
        COMMIT TRANSACTION
            -- What happens here to @MyImportantVariable?
           SET @Counter = 0
        BEGIN TRANSACTION
    END
END

-- Close the transaction one last time
COMMIT TRANSACTION
4

1 に答える 1

2

変数は引き続き存在します。

あなたの例にはGOコマンドは含まれておらず、トランザクションのみが含まれています。

GOバッチの終了を通知します...バッチとトランザクションはまったく別のものです。

MSDN から:

GO は Transact-SQL ステートメントではありません。これは、sqlcmd ユーティリティと osql ユーティリティ、および SQL Server Management Studio コード エディターによって認識されるコマンドです。

SQL Server ユーティリティは、GO を、Transact-SQL ステートメントの現在のバッチを SQL Server のインスタンスに送信する必要があるというシグナルとして解釈します。ステートメントの現在のバッチは、最後の GO 以降、またはこれが最初の GO である場合はアドホック セッションまたはスクリプトの開始以降に入力されたすべてのステートメントで構成されます。

于 2012-11-08T22:35:11.303 に答える