MS SQL Server Management Studio에서 트랜잭션 작업을 수행하는 가장 좋은 방법


127

구문 상 및 의미 상 올바른 SQL 문이있어 실행된다고 가정 해 보겠습니다.

Management Studio (또는 기타 쿼리 도구)에서 SQL 문을 테스트하려면 어떻게해야하며, SQL 문이 손상되었음을 발견하면 롤백 (별도의 쿼리에서?)

답변:


227

가장 쉬운 방법은 트랜잭션에서 코드를 래핑 한 다음 T-SQL 코드의 각 배치를 한 줄씩 실행하는 것입니다.

예를 들면

Begin Transaction

         -Do some T-SQL queries here.

Rollback transaction -- OR commit transaction

오류 처리를 통합하려면 TRY ... CATCH BLOCK을 사용하면됩니다. 오류가 발생하면 catch 블록 내에서 tranasction을 롤백 할 수 있습니다.

예를 들면 :

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에 대해 처음 보았습니다. ROLLBACK 처리 후 "IF @@ TRANCOUNT> 0 COMMIT TRANSACTION"이 어떻게되는지 말씀해 주시겠습니까? @@ TRANCOUNT에는 어떤 값이 있습니까? 다시 한 번 감사드립니다.
QMaster 2015-06-20

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.