Cara terbaik untuk bekerja dengan transaksi di MS SQL Server Management Studio

127

Katakanlah saya memiliki pernyataan SQL yang benar secara sintaksis dan semantik sehingga dieksekusi.

Di Studio Manajemen (atau alat kueri lainnya) bagaimana cara menguji pernyataan SQL, dan jika saya perhatikan bahwa pernyataan tersebut merusak sesuatu, kembalikan (dalam kueri terpisah?)

Niels Bosma
sumber

Jawaban:

227

Hal termudah yang harus dilakukan adalah membungkus kode Anda dalam sebuah transaksi, dan kemudian mengeksekusi setiap kumpulan kode T-SQL baris demi baris.

Sebagai contoh,

Begin Transaction

         -Do some T-SQL queries here.

Rollback transaction -- OR commit transaction

Jika Anda ingin memasukkan penanganan kesalahan, Anda dapat melakukannya dengan menggunakan TRY ... CATCH BLOCK. Jika terjadi kesalahan, Anda dapat mengembalikan tranasction di dalam blok catch.

Sebagai contoh:

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

Lihat tautan berikut untuk lebih jelasnya.

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

Semoga ini membantu, tetapi beri tahu saya jika Anda memerlukan detail lebih lanjut.

John Sansom
sumber
3
Hai terima kasih. Saya melihat untuk pertama kalinya tentang @@ TRANCOUNT di sini dan dapatkah Anda memberi tahu saya apa yang terjadi dengan "IF @@ TRANCOUNT> 0 COMMIT TRANSACTION" setelah pemrosesan ROLLBACK? dan nilai apa yang dimiliki @@ TRANCOUNT? Terima kasih lagi.
QMaster
2
Setelah menjalankan ROLLBACK TRANSACTION @@ TRANCOUNT diatur kembali ke 0. Dengan itu TRANSAKSI COMMIT tidak akan dijalankan. Lihat msdn.microsoft.com/de-de/library/ms187967.aspx
Christoph Brückmann
8

Saya ingin menambahkan poin yang Anda juga dapat (dan jika yang Anda tulis rumit) menambahkan variabel uji ke rollback jika Anda dalam mode uji. Kemudian Anda dapat menjalankan semuanya sekaligus. Seringkali saya juga menambahkan kode untuk melihat hasil sebelum dan sesudah dari berbagai operasi terutama jika itu adalah skrip yang kompleks.

Contoh di bawah ini:

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