TSQL - How to use GO inside of a BEGIN .. END block?

后端 未结 8 937
一生所求
一生所求 2020-12-02 18:06

I am generating a script for automatically migrating changes from multiple development databases to staging/production. Basically, it takes a bunch of change-scripts, and m

8条回答
  •  鱼传尺愫
    2020-12-02 18:23

    You could try sp_executesql, splitting the contents between each GO statement into a separate string to be executed, as demonstrated in the example below. Also, there is a @statementNo variable to track which statement is being executed for easy debugging where an exception occurred. The line numbers will be relative to the beginning of the relevant statement number that caused the error.

    BEGIN TRAN
    
    DECLARE @statementNo INT
    BEGIN TRY
        IF 1=1
        BEGIN
            SET @statementNo = 1
            EXEC sp_executesql
                N'  ALTER TABLE dbo.EMPLOYEE
                        ADD COLUMN EMP_IS_ADMIN BIT NOT NULL'
    
            SET @statementNo = 2
            EXEC sp_executesql
                N'  UPDATE dbo.EMPLOYEE
                        SET EMP_IS_ADMIN = 1'
    
            SET @statementNo = 3
            EXEC sp_executesql
                N'  UPDATE dbo.EMPLOYEE
                        SET EMP_IS_ADMIN = 1x'
        END
    END TRY
    BEGIN CATCH
        PRINT 'Error occurred on line ' + cast(ERROR_LINE() as varchar(10)) 
           + ' of ' + 'statement # ' + cast(@statementNo as varchar(10)) 
           + ': ' + ERROR_MESSAGE()
        -- error occurred, so rollback the transaction
        ROLLBACK
    END CATCH
    -- if we were successful, we should still have a transaction, so commit it
    IF @@TRANCOUNT > 0
        COMMIT
    

    You can also easily execute multi-line statements, as demonstrated in the example above, by simply wrapping them in single quotes ('). Don't forget to escape any single quotes contained inside the string with a double single-quote ('') when generating the scripts.

提交回复
热议问题