|
这是一些我要通过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 |
|