带“ Go”语句的带有事务/回滚的SQL脚本

时间:2019-01-29 04:43:06

标签: sql-server tsql transactions

我创建桌面应用程序。与用户一起选择.sql文件,然后使用Transaction / Rollback运行它。

在这种情况下,我从sql文件读取了所有上下文。并放在以下代码之间,以***** $ Replace $ *****文本替换sql文件脚本。

如果sql文件包含“ GO”批处理,我该如何处理事务/回滚。它的抛出错误。

任何将Handel这种方案类型的解决方案转换为任何sql文件的方法,都可以转换为Transaction / Rollback。

注意:sql文件脚本中没有更改。


sql文件脚本:

INSERT INTO [dbo].[User] ([Name]  ,[ContectNo])  VALUES ('m3','33')
    GO BEGIN TRANSACTION
    INSERT INTO [dbo].[User] ([Name]  ,[ContectNo])  VALUES ('m3',null)
    GO BEGIN TRANSACTION
    INSERT INTO [dbo].[User] ([Name]  ,[ContectNo])  VALUES ('m3','99')
    GO
-----------------------------------------------------
Transaction block: replace sql file query from *****$Replace$*****
-----------------------------------------------------


SET XACT_ABORT ON;  
GO    
BEGIN TRY
    BEGIN TRANSACTION

       *****$Replace$*****

    COMMIT TRANSACTION;

END TRY 
BEGIN CATCH  

      IF @@ERROR > 0
     BEGIN
          ROLLBACK TRANSACTION

          DECLARE @ErrorMessage NVARCHAR(max) = ERROR_MESSAGE()
          DECLARE @ErrorSeverity INT = ERROR_SEVERITY()
          DECLARE @ErrorState INT = ERROR_STATE()
          DECLARE @ErrorLine INT = ERROR_LINE()

          RAISERROR (@ErrorMessage,
                       @ErrorSeverity,
                       @ErrorState 
                      );  
     END
END CATCH
SET XACT_ABORT OFF

1 个答案:

答案 0 :(得分:0)

您遇到错误,因为GO不是应该发送到SQL Server引擎的命令。它是SSMS,sqlcmd和osql之类的工具认可的东西。它表示T-SQL语句批处理的结束,并表示到目前为止的命令(当前批处理)应发送到SQL Server引擎。

您不应尝试将GO语句作为T-SQL执行。您应该尝试解析文件GO行,将其拆分为单独的批处理并一一执行,或者确保在这些文件中传递有效的T-SQL内容。

您可以在SQL Server Utilities Statements - GO文章中查看有关GO语句的更多信息。