Najlepszy sposób na pracę z transakcjami w MS SQL Server Management Studio

127

Powiedzmy, że mam instrukcję SQL, która jest poprawna składniowo i semantycznie, więc jest wykonywana.

W Management Studio (lub jakimkolwiek innym narzędziu do zapytań) jak mogę przetestować instrukcje SQL i jeśli zauważę, że coś zepsuły, wycofaj (w osobnym zapytaniu?)

Niels Bosma
źródło

Odpowiedzi:

227

Najłatwiej jest zawrzeć kod w transakcji, a następnie wykonać każdą partię kodu T-SQL wiersz po wierszu.

Na przykład,

Begin Transaction

         -Do some T-SQL queries here.

Rollback transaction -- OR commit transaction

Jeśli chcesz uwzględnić obsługę błędów, możesz to zrobić za pomocą TRY ... CATCH BLOCK. W przypadku wystąpienia błędu można wycofać tranascję w bloku catch.

Na przykład:

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

Zobacz poniższy link, aby uzyskać więcej informacji.

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

Mam nadzieję, że to pomoże, ale daj mi znać, jeśli potrzebujesz więcej informacji.

John Sansom
źródło
3
Cześć, dzięki. Po raz pierwszy zobaczyłem tutaj @@ TRANCOUNT i czy możesz mi powiedzieć, co się stało z „IF @@ TRANCOUNT> 0 ZATWIERDŹ TRANSAKCJĘ” po przetworzeniu ROLLBACK? a jaką wartość ma @@ TRANCOUNT? Dzięki jeszcze raz.
QMaster
2
Po rozliczeniu ROLLBACK TRANSACTION @@ TRANCOUNT jest ustawiany z powrotem na 0. Przez to COMMIT TRANSACTION nie zostanie wykonany. Zobacz msdn.microsoft.com/de-de/library/ms187967.aspx
Christoph Brückmann
8

Chcę dodać punkt, w którym możesz również (i powinieneś, jeśli to, co piszesz jest skomplikowane), dodać zmienną testową do wycofania, jeśli jesteś w trybie testowym. Wtedy możesz wykonać całą rzecz naraz. Często dodaję również kod, aby zobaczyć wyniki różnych operacji przed i po, zwłaszcza jeśli jest to złożony skrypt.

Przykład poniżej:

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
źródło