MS SQL Server Management Studioでトランザクションを操作する最良の方法


127

構文的にも意味的にも正しいSQLステートメントがあるとしましょう。

Management Studio(またはその他のクエリツール)でSQLステートメントをテストするにはどうすればよいですか。また、SQLステートメントが何かを壊したことに気付いた場合は、(別のクエリで)ロールバックします。

回答:


227

最も簡単な方法は、コードをトランザクションでラップし、T-SQLコードの各バッチを1行ずつ実行することです。

例えば、

Begin Transaction

         -Do some T-SQL queries here.

Rollback transaction -- OR commit transaction

エラー処理を組み込む場合は、TRY ... CATCH BLOCKを使用して行うことができます。エラーが発生した場合は、catchブロック内でトランザクションをロールバックできます。

例えば:

USE AdventureWorks;
GO
BEGIN TRANSACTION;

BEGIN TRY
    -- Generate a constraint violation error.
    DELETE FROM Production.Product
    WHERE ProductID = 980;
END TRY
BEGIN CATCH
    SELECT 
        ERROR_NUMBER() AS ErrorNumber
        ,ERROR_SEVERITY() AS ErrorSeverity
        ,ERROR_STATE() AS ErrorState
        ,ERROR_PROCEDURE() AS ErrorProcedure
        ,ERROR_LINE() AS ErrorLine
        ,ERROR_MESSAGE() AS ErrorMessage;

    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION;
END CATCH;

IF @@TRANCOUNT > 0
    COMMIT TRANSACTION;
GO

詳細については、次のリンクを参照してください。

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

これがお役に立てば幸いですが、詳細が必要な場合はお知らせください。


3
ありがとね。ここで@@ TRANCOUNTについて初めて見ましたが、ROLLBACK処理後に "IF @@ TRANCOUNT> 0 COMMIT TRANSACTION"がどうなるか教えていただけますか?@@ TRANCOUNTにはどのような値がありますか?再度、感謝します。
QMaster

2
ROLLBACK TRANSACTIONを実行すると、@@ TRANCOUNTが0に戻ります。これにより、COMMIT TRANSACTIONは実行されません。msdn.microsoft.com/de-de/library/ms187967.aspxを
ChristophBrückmann16年

8

テストモードの場合は、ロールバックにテスト変数を追加することもできます(作成しているものが複雑な場合は追加する必要があります)。その後、すべてを一度に実行できます。特に複雑なスクリプトの場合は、さまざまな操作の前と後の結果を確認するコードを追加することもよくあります。

以下の例:

USE AdventureWorks;
GO
DECLARE @TEST INT = 1--1 is test mode, use zero when you are ready to execute
BEGIN TRANSACTION;

BEGIN TRY
     IF @TEST= 1
        BEGIN
            SELECT *FROM Production.Product
                WHERE ProductID = 980;
        END    
    -- Generate a constraint violation error.
    DELETE FROM Production.Product
    WHERE ProductID = 980;

     IF @TEST= 1
        BEGIN
            SELECT *FROM Production.Product
                WHERE ProductID = 980;
            IF @@TRANCOUNT > 0
                ROLLBACK TRANSACTION;
        END    
END TRY

BEGIN CATCH
    SELECT 
        ERROR_NUMBER() AS ErrorNumber
        ,ERROR_SEVERITY() AS ErrorSeverity
        ,ERROR_STATE() AS ErrorState
        ,ERROR_PROCEDURE() AS ErrorProcedure
        ,ERROR_LINE() AS ErrorLine
        ,ERROR_MESSAGE() AS ErrorMessage;

    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION;
END CATCH;

IF @@TRANCOUNT > 0 AND @TEST = 0
    COMMIT TRANSACTION;
GO
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.