加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

我们可以在SQL Transaction中多次使用’GO’吗?

发布时间:2020-12-12 06:42:17 所属栏目:MsSql教程 来源:网络整理
导读:我们可以在SQL事务中多次使用GO语句.我有一个很长的T-SQL脚本,我想在SQL事务中运行它.如果一切顺利,那么我将提交否则将回滚. 但是,在运行该查询时,我收到错误,例如’create function必须是批处理中唯一的语句’.因为我在创建和删除许多函数和过程. 我没有在脚
我们可以在SQL事务中多次使用GO语句.我有一个很长的T-SQL脚本,我想在SQL事务中运行它.如果一切顺利,那么我将提交否则将回滚.

但是,在运行该查询时,我收到错误,例如’create function必须是批处理中唯一的语句’.因为我在创建和删除许多函数和过程.

我没有在脚本中的任何地方使用GO.我的问题是 – 我可以在那个长脚本中多次使用GO语句.因为,GO创建了一个批处理,如果批处理第一次成功执行但是下次失败则会回滚事务语句能够实际回滚已经执行的吗?

我的脚本结构如下:

PRINT 'Transaction Started'
BEGIN TRY
    BEGIN TRAN

    Drop Function 
    ....
    ....
    Create Function
    ....
    ....
    Drop Procedure
    ....
    ....
    Lots of statements
    ....
    ....

    COMMIT TRAN
    PRINT 'Transaction Succeeded'
END TRY
BEGIN CATCH
    PRINT 'Transaction Failed'
    IF(@@TRANCOUNT > 0)
        ROLLBACK TRAN
END CATCH

我正在创建此脚本,以便在单个脚本中将一些更改从newDB迁移到oldDB.

解决方法

你在混合概念. GO不是Transact-SQL概念,不是语言的一部分,并且不被SQL Server理解. GO是工具批分隔符. sqlcmd.exe和SSMS默认使用GO作为批处理分隔符.批处理分隔符用于标识SQL源文件中的各个批处理.客户端工具一次向服务器发送一批(当然,省略分隔符).

交易可以跨越批次. TRY / CATCH块不能. CREATE / ALTER语句必须是批处理中的唯一语句(注释不是语句,并且包含在函数过程体中的语句包含在内).

可以通过启动事务并在第一个错误(-b at sqlcmd.exe start,或使用:on error exit in SSMS)上取消执行来实现与您想要执行的操作类似的操作.

但是在长事务中执行DDL是行不通的.特别是如果你打算将它与DML混合使用.我必须调查的大多数损坏来自这种组合(Xact,DDL DML,回滚).我强烈建议不要这样做.

安全部署架构更新的唯一方法是在出现问题时从备份进行备份,部署和还原.

请注意,Dan推荐的(动态SQL)有效,因为sp_executesql启动了一个新的内部批处理.该批次将满足CREATE / ALTER限制.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读