Cách tốt nhất để làm việc với các giao dịch trong MS SQL Server Management Studio


126

Giả sử tôi có một câu lệnh SQL đúng về mặt cú pháp và ngữ nghĩa để nó thực thi.

Trong Management Studio (hoặc bất kỳ công cụ truy vấn nào khác) làm cách nào tôi có thể kiểm tra các câu lệnh SQL và nếu tôi nhận thấy rằng chúng đã phá vỡ một cái gì đó, hãy khôi phục (trong một truy vấn riêng biệt?)

Câu trả lời:


226

Điều dễ nhất để làm là bọc mã của bạn trong một giao dịch, và sau đó thực thi từng lô mã T-SQL theo từng dòng.

Ví dụ,

Begin Transaction

         -Do some T-SQL queries here.

Rollback transaction -- OR commit transaction

Nếu bạn muốn kết hợp xử lý lỗi, bạn có thể làm như vậy bằng cách sử dụng TRY ... CATCH BLOCK. Nếu xảy ra lỗi, sau đó bạn có thể khôi phục lại tranasction trong khối bắt.

Ví dụ:

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

Xem liên kết sau để biết thêm chi tiết.

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

Hy vọng điều này sẽ giúp nhưng xin vui lòng cho tôi biết nếu bạn cần thêm chi tiết.


3
Xin chào, cảm ơn. Tôi đã nhìn thấy lần đầu tiên về @@ TRANCOUNT tại đây và bạn có thể cho tôi biết điều gì xảy ra với "NẾU @@ TRANCOUNT> 0 GIAO DỊCH CAM KẾT" sau khi xử lý ROLLBACK không? và @@ TRANCOUNT có giá trị gì? Cảm ơn một lần nữa.
QMaster

2
Sau khi loại bỏ GIAO DỊCH ROLLBACK @@ TRANCOUNT được đặt lại về 0. Do đó, GIAO DỊCH CAM KẾT sẽ không được thực hiện. Xem msdn.microsoft.com/de-de/l Library / ms187967.aspx
Christoph Brückmann

8

Tôi muốn thêm một điểm mà bạn cũng có thể (và nên nếu những gì bạn đang viết là phức tạp) hãy thêm một biến kiểm tra để quay lại nếu bạn đang ở chế độ kiểm tra. Sau đó, bạn có thể thực hiện toàn bộ điều cùng một lúc. Thường thì tôi cũng thêm mã để xem kết quả trước và sau của các hoạt động khác nhau, đặc biệt nếu đó là một tập lệnh phức tạp.

Ví dụ dưới đây:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.