วิธีที่ดีที่สุดในการทำงานกับธุรกรรมใน MS SQL Server Management Studio


127

สมมติว่าฉันมีคำสั่ง SQL ที่ถูกต้องตามหลักไวยากรณ์และเชิงความหมายดังนั้นจึงดำเนินการ

ใน Management Studio (หรือเครื่องมือสืบค้นข้อมูลอื่น ๆ ) ฉันจะทดสอบคำสั่ง SQL ได้อย่างไรและถ้าฉันสังเกตเห็นว่ามีบางอย่างขัดข้องให้ย้อนกลับ (ในแบบสอบถามแยกต่างหาก)

คำตอบ:


227

สิ่งที่ง่ายที่สุดที่ต้องทำคือห่อรหัสของคุณในธุรกรรมจากนั้นดำเนินการชุดรหัส T-SQL ทีละบรรทัด

ตัวอย่างเช่น,

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 ที่นี่และคุณสามารถบอกได้ไหมว่าเกิดอะไรขึ้นกับ "IF @@ TRANCOUNT> 0 COMMIT TRANSACTION" หลังจากการประมวลผล ROLLBACK และ @@ TRANCOUNT มีค่าเท่าใด ขอบคุณอีกครั้ง.
QMaster

2
หลังจากแยก ROLLBACK TRANSACTION @@ TRANCOUNT จะถูกตั้งค่ากลับเป็น 0 โดยที่ COMMIT TRANSACTION จะไม่ถูกดำเนินการ ดูmsdn.microsoft.com/de-de/library/ms187967.aspx
Christoph Brückmann

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.