回答

收藏

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

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

这是一些我要通过sqlcmd(SQL Server 2005)运行的Transact-SQL。) t  z5 V3 m! ?2 N4 {
USE PUK;: h) r! S; |- o" B$ F/ d$ z
GO/ @; w# Y0 A2 m7 Q% m
BEGIN TRANSACTION;; n5 z* {7 y, _
BEGIN TRY
# h0 E9 c9 y* [9 R/ C- D1 J   -- - Modify RETRIEVAL_STAT
2 X/ W! s: ?4 b: X; x   alter table dbo.RETRIEVAL_STAT add/ P  g6 H) {6 u' x2 r3 e% \
      SOURCE nvarchar(10) NULL," S6 {  _& m6 L6 x3 w
      ACCOUNTNUMBER nvarchar(50) NULL,
  W- t1 L4 |: [. ]/ J7 q. S( L      PUK nvarchar(20) NULL;+ X6 H0 Z' K" d
   -- transform logic.) m( G. J  N2 e/ W& h$ G2 V
   update dbo.RETRIEVAL_STAT set
' ]7 |( L" y" s) n& l/ a  F      SOURCE = 'XX',* Z5 J. V$ X+ R' n
      ACCOUNTNUMBER = 'XX',  U" c% P: z6 s! m7 K
      PUK = 'XX';
6 N7 g# U* G- Q% w+ L! o" I" dEND TRY
* a" w  M7 u! C/ f5 ^+ p3 S+ |BEGIN CATCH
9 |6 b1 x/ W& m- u# P' e, q    SELECT/ ], ?) R( I; \( D7 L
        ERROR_NUMBER() AS ErrorNumber3 s. B' G7 A6 m1 E  G' r- k8 A/ I
        ,ERROR_SEVERITY() AS ErrorSeverity
! _& u. c1 U" `0 H        ,ERROR_STATE() AS ErrorState' A. x, K. j2 C
        ,ERROR_PROCEDURE() AS ErrorProcedure3 P! Q/ n+ z1 j  w5 ~: T
        ,ERROR_LINE() AS ErrorLine
8 u) ^, h0 c, y' t$ t% r        ,ERROR_MESSAGE() AS ErrorMessage;; n' Q8 v. K  ?$ W$ i2 ^
    IF @@TRANCOUNT > 09 x$ w. ^$ O' Z( l/ f2 l
        ROLLBACK TRANSACTION;. u( h0 V4 I* E0 T; K2 f( h
END CATCH;; w/ B/ J5 F9 r3 C6 N
IF @@TRANCOUNT > 0! Q+ Y" Y& h' F0 d" a
    COMMIT TRANSACTION;& h' n% r) n' W/ n- B9 Z
GO
: b8 \1 T9 S/ N  X我收到以下错误:" s) |' ~2 G- Q% M- ~
(0 rows affected)( w9 z  h) s; p3 d. n& Y1 N! V
Changed database context to 'PUK'.
$ ^6 S% n. v  Z/ e  AMsg 207, Level 16, State 1, Server localhost\SQLEXPRESS, Line 11' p( U; x8 d1 W4 r+ T5 x
Invalid column name 'SOURCE'.9 c1 f( ?4 g6 f1 {' I
Msg 207, Level 16, State 1, Server localhost\SQLEXPRESS, Line 11
* }) O: J; A1 r) BInvalid column name 'ACCOUNTNUMBER'.4 Z8 b' `" S; b* S3 @# G! {
Msg 207, Level 16, State 1, Server localhost\SQLEXPRESS, Line 11  p' x+ g2 Z& I7 B4 w
Invalid column name 'PUK'.
3 m# F: p9 H6 B7 D' i我猜这是因为尚未提交alter语句引入的新列,因此更新失败。5 F; }5 v7 `0 O
我的问题是我如何才能使它正常工作?我希望它可以作为单个事务运行,如果出现问题,我可以回滚。。这很重要,因为我要包含更多的alter语句,并且对我无法逾越这一点感到沮丧。
$ l/ o& T; {+ M5 k0 _( P0 L+ `任何帮助将不胜感激!' C4 _. l& i* ?, w; J
罗伯
0 z- j/ e- p" }* o4 Y                6 \# x5 d( E8 ^0 d) ]8 @
解决方案:8 D# \! F0 C% b/ F: B( B
               
: e  `% C! Y+ Z& ]3 U/ D
, F( b4 U" a" D7 @: [; ]+ k# l# E& S
                即使我在写自己的答案,所有的功劳都归@Mikael Eriksson,他建议我需要用GO分开不同的批次-
5 E3 n2 ?' ^9 T( Q' }- V这样,更改表的代码不会与使用更改后的表的代码冲突。谢谢Mikael!
( T' H/ ]8 m. H2 nUSE PUK;
3 C/ k1 q; ~5 P5 yGO7 q3 [2 `: K3 ?6 F& n
BEGIN TRANSACTION;+ @; S1 {" g& I% G9 n# `2 f, b
BEGIN TRY
# C; h6 b6 M1 A: U; c   -- - Modify RETRIEVAL_STAT# o6 Y  k. ?- v  d
   alter table dbo.RETRIEVAL_STAT add
3 \1 s% \% W6 _6 m" n' f      SOURCE nvarchar(10) NULL,
; t; o1 U, C, M% x# g      ACCOUNTNUMBER nvarchar(50) NULL,! |6 _) j; i" Q8 ?
      PUK nvarchar(20) NULL;
9 Z5 J7 J' {0 d$ j" h: ^END TRY3 J6 F( w6 V8 _7 o5 s0 D2 ~
BEGIN CATCH
0 W# Y: F; ^' w/ a( O" Z. w( |    SELECT$ P  n2 V$ Z5 }* z
        ERROR_NUMBER() AS ErrorNumber5 r, y/ J! V3 J% x7 V
        ,ERROR_SEVERITY() AS ErrorSeverity9 Z6 _6 h0 ~% C) R. i4 a4 c$ D0 c
        ,ERROR_STATE() AS ErrorState: u! |+ I$ P3 U
        ,ERROR_PROCEDURE() AS ErrorProcedure
7 R# o  Z" g6 D) E8 S4 i7 b4 T4 s        ,ERROR_LINE() AS ErrorLine
9 e1 @& Q) ~7 _2 M( q5 ]        ,ERROR_MESSAGE() AS ErrorMessage;
! H4 D9 w& Z- l/ A9 B( z    IF @@TRANCOUNT > 0
) V, U$ \  t6 R        ROLLBACK TRANSACTION;
7 @; C, i, {) t% VEND CATCH;
& G' p+ L+ B: {! M; Q2 fIF @@TRANCOUNT > 0
! O" F" @; ~9 t& G0 L    COMMIT TRANSACTION;4 f& a  e3 D) Y, W  ?! q
GO6 L" C6 i$ X7 p5 e+ x# b3 B
' M  ~  N2 v6 Z8 w  L
USE PUK;% u9 F# Z2 J' i- d! M, N
GO( b  {3 b* t5 F" }$ G$ [
BEGIN TRANSACTION;' i2 }1 S6 Y4 N& C8 e
BEGIN TRY6 n, j* A$ _4 j, ^7 K1 {& ~2 R
    -- transform logic.8 k. I2 _4 ~  ]1 S3 c) ?8 B
   UPDATE      dbo.RETRIEVAL_STAT
4 R" F  p" K! A4 z   SET         SOURCE = 'ABC',+ m' H. w& o! i% `9 ]. s/ o) u
               ACCOUNTNUMBER = ABC.ACCOUNTNUMBER,
2 y$ S2 _# R3 z. l  Y               PUK = ABC.PUK
' ?3 u. w( K$ o0 [5 z   FROM        RETRIEVAL_STAT RS7 A$ `5 L) O% p& G
   INNER JOIN  ABC
# P$ D; s8 P2 R1 l% \9 T   ON          RS.SERVICE_NUMBER = ABC.SERVICENUMBER;: B$ W; P* i4 t
   UPDATE      dbo.RETRIEVAL_STAT/ \% e1 [* p! D, [$ B
   SET         SOURCE = 'DEF',
. T% {( j2 D, a3 s               ACCOUNTNUMBER = DEF.BILLINGACCOUNTNUMBER ,
3 |9 m( e( S$ ~% V, C) q8 h2 ^               PUK = DEF.PUK- f( d: A( k* G/ q; g! ]9 @: n" f
   FROM        RETRIEVAL_STAT RS
4 h+ C( ], |" G; m   INNER JOIN  DEF8 L% L: c1 X2 C7 Y, {+ ]. o
   ON          RS.SERVICE_NUMBER = DEF.SERVICENUMBER;. x4 U" |$ h) Y3 {
   UPDATE      dbo.RETRIEVAL_STAT0 r" k% x+ c7 O8 W6 L. B2 N3 n
   SET         SOURCE = 'No Match'
# X7 p8 v% E; N2 n$ T$ U   WHERE       SOURCE IS NULL;8 `: Y1 v, Z( X) l
    -- Fix other columns that should be not nullable.
4 |6 o( f. [+ G1 T* }   alter table dbo.RETRIEVAL_STAT' ^3 [. U. t4 _
      alter column SERVICE_NUMBER nvarchar (50) NOT NULL;
5 N4 a; F7 y/ x; b- L4 }   alter table dbo.DEF+ C8 Z& }0 ^# e  \. c
      alter column PUK nvarchar (20) NOT NULL;! \5 Z& J0 P& u: \: Q5 O5 H% T

9 C! j3 u( d9 E: zEND TRY
$ l- h9 R8 a8 JBEGIN CATCH8 f+ x/ O3 R! }- G
    SELECT
6 G& y3 \  L3 C% C( R2 z        ERROR_NUMBER() AS ErrorNumber
8 y6 Q5 |! q( z, R4 U        ,ERROR_SEVERITY() AS ErrorSeverity0 H6 q' v' A3 S8 j( A# `9 S+ e+ y7 F
        ,ERROR_STATE() AS ErrorState
: n9 p4 m- ~+ J9 o# D        ,ERROR_PROCEDURE() AS ErrorProcedure5 b6 g1 U$ ^  P4 g3 |  m8 |& g  y( \
        ,ERROR_LINE() AS ErrorLine
$ Y5 R5 O. O/ ~7 g! L0 t        ,ERROR_MESSAGE() AS ErrorMessage;
' n6 u3 G1 d$ |& O1 C) u    IF @@TRANCOUNT > 04 z$ m7 h0 A6 k
        ROLLBACK TRANSACTION;
1 n# d' n5 |2 `# [2 SEND CATCH;0 u; i3 q" o# Z
IF @@TRANCOUNT > 0; a' k5 b& A5 m% Y: w
    COMMIT TRANSACTION;6 T# e/ g" |( h1 \: T
GO
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则