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

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

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



답변

가장 쉬운 방법은 트랜잭션에서 코드를 래핑 한 다음 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

이것이 도움이되기를 바라지 만 더 자세한 정보가 필요하면 알려주세요.


답변

테스트 모드에있는 경우 롤백 할 테스트 변수를 추가 할 수도 있습니다 (작성중인 내용이 복잡한 경우). 그런 다음 모든 것을 한 번에 실행할 수 있습니다. 종종 복잡한 스크립트 인 경우 다양한 작업의 전후 결과를 볼 수있는 코드를 추가하기도합니다.

아래 예 :

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


답변