web-dev-qa-db-ja.com

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

構文的にも意味的にも正しいSQLステートメントがあり、実行されるとします。

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

119
Niels Bosma

最も簡単なことは、コードをトランザクションにラップし、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

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

219
John Sansom

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

以下の例:

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
5
HLGEM