回答

收藏

使用Transact-SQL进行Alter修改然后在tran尝试捕获中更新的问题

技术问答 技术问答 102 人阅读 | 0 人回复 | 2023-09-13

这是一些我要通过sqlcmd(SQL Server 2005)运行的Transact-SQL。
7 d' u3 v- S  m1 s( L' y7 A( [1 Y  \USE PUK;3 |) s2 g: v" o8 H
GO
8 C1 ~( S7 B# `5 f1 h. W  yBEGIN TRANSACTION;
. R2 g+ F" w' q$ |! T3 ZBEGIN TRY8 E  P+ s- M- S
   -- - Modify RETRIEVAL_STAT  X5 a: Z8 _; b" D
   alter table dbo.RETRIEVAL_STAT add
+ f' w& Q- h7 I1 @2 G      SOURCE nvarchar(10) NULL,) j' p3 v$ J( r8 ], ]) {4 d
      ACCOUNTNUMBER nvarchar(50) NULL,
' \2 y2 s" ~' C& U      PUK nvarchar(20) NULL;+ K* a3 ?# ^* f2 v  y
   -- transform logic.( W( @$ m) P7 O0 M7 B8 d
   update dbo.RETRIEVAL_STAT set
: Y6 m0 o+ n: w7 R; N: V; {9 z: Q* @: S      SOURCE = 'XX',4 q' C7 \4 ~: |, X) l+ n/ o/ |/ E
      ACCOUNTNUMBER = 'XX',9 [- Q. ^$ v0 Y2 |) S/ `4 ?  {
      PUK = 'XX';
0 W  I9 S# o/ @2 [END TRY
' U8 K; \9 R. V  ?+ yBEGIN CATCH! C1 ?2 v5 K. t. l/ V: y
    SELECT7 V0 d9 B) x2 I* I8 O& q; K# s+ x
        ERROR_NUMBER() AS ErrorNumber% Y2 R; z! W( j9 o. r
        ,ERROR_SEVERITY() AS ErrorSeverity; W) d* L% i( C% v: Y" j7 L
        ,ERROR_STATE() AS ErrorState
6 y' n: O4 D- C" U6 S" D# z( R' l        ,ERROR_PROCEDURE() AS ErrorProcedure
) V0 C  z6 N- m$ }: ~        ,ERROR_LINE() AS ErrorLine
$ C+ y$ r9 I3 K6 w5 r4 _        ,ERROR_MESSAGE() AS ErrorMessage;; @" b8 ]5 n, Z* h$ I+ }  D' q' L0 u
    IF @@TRANCOUNT > 0
! B( L4 _% |/ m        ROLLBACK TRANSACTION;
) J5 ]9 K! Q9 c. q" {: bEND CATCH;
3 D% M+ ~# l% g# I; X6 f9 t# h( VIF @@TRANCOUNT > 0
$ n0 V2 G1 V+ d    COMMIT TRANSACTION;
' q# k+ f6 A7 BGO" H7 f9 t6 }/ F/ K6 k1 w$ T
我收到以下错误:& }7 M0 T! Q- _
(0 rows affected)
- U4 Q, w' U/ Z4 P, |( [4 qChanged database context to 'PUK'.6 K* M# I5 X; Y: }; d9 A- n  @2 m
Msg 207, Level 16, State 1, Server localhost\SQLEXPRESS, Line 11  Q- D# w0 E3 c6 d
Invalid column name 'SOURCE'.
3 k* r7 e3 ^1 h4 tMsg 207, Level 16, State 1, Server localhost\SQLEXPRESS, Line 11
" y# g) I7 H7 P9 VInvalid column name 'ACCOUNTNUMBER'.
4 V( g: u- D; yMsg 207, Level 16, State 1, Server localhost\SQLEXPRESS, Line 11/ ?! T0 z9 g- g0 x4 K& p
Invalid column name 'PUK'.
/ ?8 D; Q5 ^" S2 z5 `我猜这是因为尚未提交alter语句引入的新列,因此更新失败。
, Z3 g5 a9 e; D2 o1 E( }我的问题是我如何才能使它正常工作?我希望它可以作为单个事务运行,如果出现问题,我可以回滚。。这很重要,因为我要包含更多的alter语句,并且对我无法逾越这一点感到沮丧。( h% ^8 F- H) \+ d# o1 O% }4 f
任何帮助将不胜感激!& h: W$ o$ {" U4 c+ p! w& g
罗伯, t( V9 L# }. V
               
( m' G! N5 ^& w) z+ l) z解决方案:7 V; S) C3 N- T" x/ T; O
               
, W, g2 E# d6 {* x$ D/ ]. g$ b0 J0 @. D: d4 D8 `$ l
9 n- k+ i7 c! ^+ e
                即使我在写自己的答案,所有的功劳都归@Mikael Eriksson,他建议我需要用GO分开不同的批次-
# q2 ?9 c/ T! c( G6 N这样,更改表的代码不会与使用更改后的表的代码冲突。谢谢Mikael!
5 S) F. E  Y/ l3 yUSE PUK;2 _2 F3 V' a* E( V8 N, k, H1 S
GO; U& c/ ^1 ~+ b& r4 ~/ b7 H
BEGIN TRANSACTION;
( J( W( E7 V7 U  G- u. W+ b+ qBEGIN TRY
; V9 l$ _# G" w8 _1 Y6 k   -- - Modify RETRIEVAL_STAT  R6 B+ G% @  q; U# S% t% {8 Q; A
   alter table dbo.RETRIEVAL_STAT add
' S' ?# L, r, Q" Y* I3 T% n; x8 b# J      SOURCE nvarchar(10) NULL,
4 @: s6 B  u! J+ \      ACCOUNTNUMBER nvarchar(50) NULL,% j/ k) y& b: A1 R7 d8 [, Z
      PUK nvarchar(20) NULL;3 ~1 ]2 l; g/ [# z4 W7 C
END TRY
! o* }8 ?4 ?8 C) z% G+ yBEGIN CATCH
( h" w2 J7 q7 _4 v8 U9 @6 Y    SELECT) S3 q3 K+ V1 u! W
        ERROR_NUMBER() AS ErrorNumber% D% l3 G' i& @/ f
        ,ERROR_SEVERITY() AS ErrorSeverity: W$ [, S0 L5 i" D/ F8 Q
        ,ERROR_STATE() AS ErrorState
; V+ j5 |6 b* b$ w        ,ERROR_PROCEDURE() AS ErrorProcedure. H5 i0 b) U1 {* S3 J
        ,ERROR_LINE() AS ErrorLine
" u2 V" u, E: o, n        ,ERROR_MESSAGE() AS ErrorMessage;+ |9 |7 |6 `3 Y
    IF @@TRANCOUNT > 0
1 J. w* t. W  \* n        ROLLBACK TRANSACTION;/ V  |0 j4 x+ E8 M6 t
END CATCH;
$ c" }8 }8 H* A$ fIF @@TRANCOUNT > 0
/ a4 o( p  a1 C! M& r    COMMIT TRANSACTION;
) F+ S4 v( |" J' xGO
; I5 X. }. Q% d, ^: g  B. e) i
) \, A( E4 R* e" PUSE PUK;4 n5 R! a' D  V$ [" ^0 V
GO
) s6 |% d4 n0 ~/ `) ABEGIN TRANSACTION;
' p- F9 M: w" d; f# JBEGIN TRY0 t: l; j0 ^2 ]  w( `1 Z7 J; h
    -- transform logic.
' I# Y- |( O! T& E   UPDATE      dbo.RETRIEVAL_STAT0 ?0 C6 d% z  \) B7 M9 o( Y
   SET         SOURCE = 'ABC',9 h% r4 d+ m* s1 ~! i8 `+ |
               ACCOUNTNUMBER = ABC.ACCOUNTNUMBER," Q- t7 A# W7 l5 E
               PUK = ABC.PUK8 T. U0 B- n/ A
   FROM        RETRIEVAL_STAT RS3 z- Y0 s( y: m* S% f# f9 q
   INNER JOIN  ABC' ?2 N4 W+ r: U9 A* ?+ u5 d/ _
   ON          RS.SERVICE_NUMBER = ABC.SERVICENUMBER;# c( u1 r8 |$ U% g# O% p
   UPDATE      dbo.RETRIEVAL_STAT
7 `9 Q2 b3 U' e8 }* Z# T   SET         SOURCE = 'DEF',+ V/ X! k, u  H$ \2 V" C  m2 g  l
               ACCOUNTNUMBER = DEF.BILLINGACCOUNTNUMBER ,
5 K+ P9 G  b2 f8 x               PUK = DEF.PUK
/ ^1 Y' [) w# T- |6 D" Z0 ?" c   FROM        RETRIEVAL_STAT RS5 S! ~: P) z  }
   INNER JOIN  DEF" s5 b/ Q1 V! b6 P/ k% _" c) {7 W
   ON          RS.SERVICE_NUMBER = DEF.SERVICENUMBER;6 K; _6 A/ L) `
   UPDATE      dbo.RETRIEVAL_STAT
" u% x' S% A* e. f& C& p+ J   SET         SOURCE = 'No Match'
" g0 u' m! c4 i  @& R0 M7 x; X  N   WHERE       SOURCE IS NULL;
7 u! \/ e: p& o3 U; J' i3 m+ L; ~    -- Fix other columns that should be not nullable.
  H4 X  P6 Z% K. |   alter table dbo.RETRIEVAL_STAT* j0 f8 q' ~: E0 z- ?9 t9 ^% _
      alter column SERVICE_NUMBER nvarchar (50) NOT NULL;
2 E# |. L, N$ l4 ?   alter table dbo.DEF0 }( U- X9 z" Q* g
      alter column PUK nvarchar (20) NOT NULL;$ I5 _+ T8 M/ K1 {1 m1 F! N3 R
# L9 u( O% `+ V& P2 |. C, ?
END TRY
8 [! p( Q* Q! ^7 u  N! PBEGIN CATCH
. W% k* z5 t) E4 [3 c    SELECT4 Z1 m# Z& t2 q/ W& I  g% T1 \+ N
        ERROR_NUMBER() AS ErrorNumber
+ M9 c7 u' N/ G6 d8 I7 Z/ ]! }        ,ERROR_SEVERITY() AS ErrorSeverity
8 \0 ]2 ?" V( S. ?# m0 k        ,ERROR_STATE() AS ErrorState1 K! O  x: J* [# a/ h
        ,ERROR_PROCEDURE() AS ErrorProcedure& O/ C/ Y: l6 ^" Q& j, J
        ,ERROR_LINE() AS ErrorLine! `2 K! S+ F/ M1 s2 ^4 W  F% M, d
        ,ERROR_MESSAGE() AS ErrorMessage;! z9 Z( b8 e& |9 x. ?) o/ n
    IF @@TRANCOUNT > 0' j( _7 q# v4 n1 S5 H: U& g9 l7 U7 ?
        ROLLBACK TRANSACTION;- ~; G$ b' I$ M# ~
END CATCH;; i) W7 L, ^3 ?; Z; ?: P
IF @@TRANCOUNT > 0% A) g+ m/ {5 Q
    COMMIT TRANSACTION;
& ~: c7 M0 T7 b9 ~+ ZGO
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则