回答

收藏

我们可以在SQL事务中多次使用“ GO”吗?

技术问答 技术问答 200 人阅读 | 0 人回复 | 2023-09-14

我们可以在GO语句中多次使用语句吗SQL Transaction?我的T-SQL脚本很长,我想在中运行它SQL
& ]: _; t3 |! ^2 `% v! ]Transaction。如果一切顺利,那么我将承诺否则将回滚。( E, l0 {! [& d* s; Q( M' u* x% [3 ^" t& [
但是,在运行该查询时,出现类似的错误'create function must be the only statement in the6 l! c9 R0 x. g$ h# R6 S
batch'。当我在其中创建和删除许多功能和过程时。2 g+ D3 W% h$ q5 @
我没有GO在脚本中的任何地方使用过。我的问题是-
9 L: g7 m  @; l3 T( Q" h  l我可以GO在该长脚本中使用多次语句。因为GO创建一个批处理,并且如果该批处理第一次成功执行但下次失败,那么该rollback
9 |3 T, J: E& mtransaction语句是否能够实际回滚已执行的语句?* b9 ^- ^3 _1 q0 D
我的脚本结构如下:
5 _! e( j2 T8 B8 fPRINT 'Transaction Started'
& _* R' X+ R2 [7 ]BEGIN TRY4 {) j* e$ }  |* ?& w8 J5 m1 W
    BEGIN TRAN
# |) _) Q0 `$ V' r    Drop Function
# I1 z) H) k; z    ....$ g8 I% O0 F5 ?
    ....
9 q" v7 S8 W: L! ]" I    Create Function3 p$ m0 {6 J& P# c: f
    ...., O3 ?: i7 O) s1 m) Q9 {; {
    ....
/ T5 K2 s/ w2 z$ _! v8 C3 J    Drop Procedure
, d: |& G* P% t1 j- O    ....$ g, ?9 P- P* w
    ....
3 X. I# d/ P2 `2 l    Lots of statements
% \8 @6 c" _4 c  b( t, Q' |    ..... C+ Y* k& H, k9 E  t0 {1 t. V5 j0 i# H
    ....) Q* }' N3 A, ?  L  C
    COMMIT TRAN, S+ ?, d  m  J5 F6 S3 ~
    PRINT 'Transaction Succeeded'" o) @5 U/ d6 L: M% W. B/ X  L5 j
END TRY
9 e6 V1 V) ~" lBEGIN CATCH
' A- F8 |$ C+ e" b* G    PRINT 'Transaction Failed'
9 R$ }& s0 {, m3 Z, Y: |0 m    IF(@@TRANCOUNT > 0)+ e) b; k$ B4 G
        ROLLBACK TRAN/ S2 o9 J! ~5 l; Q( g; m& L
END CATCH7 o9 [/ F- i' p6 o
我正在创建此脚本,以便在单个脚本中将一些更改从newDB迁移到oldDB。2 }6 G1 e$ C7 M6 n' g* H
                # a. s! h+ H8 l
解决方案:. P$ i  @8 Z6 j
                6 U8 l3 n4 j4 ^  @0 h4 I" B& p; @1 x- y

* W) X1 y" v2 A- D" b% K
' P3 n2 y# O# p6 m* g5 K8 ]1 T                您正在混合概念。GO不是Transact-SQL概念,不是语言的一部分,也不为SQL Server所理解。GO是工具 批定界符
6 x: U3 g4 k& v。sqlcmd.exe默认情况下,SSMS和SSMS都使用GO批次分隔符。批次定界符用于标识SQL源文件中的各个 批次  ?: [% j3 M! G5 f
。客户端工具一次向服务器发送一批(当然,省略定界符)。
" G2 w0 E& m. s6 y' q6 B7 g2 n  B( J事务可以跨越批次。TRY / CATCH块不能。CREATE / ALTER语句必须是批处理中唯一的语句(注释不是语句,函数过程体中包含的语句也可以包含)。2 {  N+ e' ?6 l6 Y
类似的事情你想做的事,可以通过启动交易来实现和abortign遇见第一个错误的执行(-b在sqlcmd.exe启动或使用n error
# U; S# ?2 R0 S( V" |exit在SSMS)。  R% j4 L9 A  \; T
但是在长事务中执行DDL是行不通的。特别是如果您打算将其与DML混合使用。我必须调查的 大多数 损坏都来自这种组合(Xact,DDL +; V, a4 f) F' t9 ^4 z+ o, d
DML,回滚)。我强烈建议不要这样做。% Z5 ~6 S8 N9 R  |4 Y$ \$ E% V6 O
安全地部署架构更新的唯一方法是在出现问题时进行备份,部署,从备份还原。
% }1 W: ^. U9 U2 s& ]请注意,Dan推荐的(动态SQL)是有效的,因为它sp_executesql开始了一个新的内部批处理。该批次将满足CREATE / ALTER限制。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则