回答

收藏

如果所有表都不存在,请添加列吗?

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

我正在使用SQL Server4 z% S8 p1 _3 F: T( b
2005/2008。我需要向表中添加一列(如果尚不存在)。这将应用于给定数据库中的所有表。我希望我能早一点,但与此解决方案有关。
# t: h  T  w! k4 j" t2 H, @" D如何才能做到这一点?
; Q5 k0 ?, o/ _3 U' R( p这是我所拥有的:
# [1 S( G% h1 REXEC sp_MSforeachtable '
% t* z. }" e3 s, y- q8 c1 i    declare @tblname varchar(255);
* _, g! ]9 h% G! H) ?" E* \! |    SET @tblname =  PARSENAME("?",1);/ Z  Z3 h4 h5 M# W
    if not exists (select column_name from INFORMATION_SCHEMA.columns
1 p3 [3 F6 ~/ W! x                   where table_name = @tblname and column_name = ''CreatedOn'')
2 c+ Y( v" U: a2 q3 a; {- t    begin
$ B/ z0 b1 y% i  u        ALTER TABLE @tblname ADD CreatedOn datetime NOT NULL DEFAULT getdate();7 @* K6 ], L2 d+ d
    end1 j6 E. B. C/ O
'
9 b2 a# H8 B: F* r  G. ^但是我得到了错误:
+ N( q# `5 n9 [/ a" O- N
" U) f/ Q/ J7 J错误102:“ @ tblname”附近的语法不正确。’CreatedOn’附近的语法不正确。“
# u8 q; G$ z2 o0 l( G& a@tblname”附近的语法不正确。’CreatedOn’附近的语法不正确。…依此类推,针对每个表格。
7 B9 z" m4 J1 H, y8 d+ U0 \" X

' U8 t% i" [4 D4 ]- a, ?               
5 N( P- `, `7 P+ Q9 `; P0 G9 C解决方案:# B' T0 g" f, K( |! x2 x
                + g9 x* u3 k% E$ x
3 C5 w2 }6 R2 ]4 Y1 t
: g  _1 [; G  K, S
                您不能在DDL中使用变量,例如@tableName。此外,将名称分成部分并忽略架构只会导致错误。您应该只在SQL批处理参数中使用“?”替换,然后依靠MSforeachtable替换:( Y* }! Y2 e( j% H1 A# _) h
EXEC sp_MSforeachtable '- h. o" y4 w3 z: c  Y* j
if not exists (select * from sys.columns
* ~6 w& ?3 }" ~2 `               where object_id = object_id(''?'')
2 M! o& T( f& ]2 G# J7 g1 h6 R+ A               and name = ''CreatedOn'')
6 B' X  L& x- l$ E+ V& Q! l7 cbegin
, s2 A. g% A+ g" S8 T  N: r    ALTER TABLE ? ADD CreatedOn datetime NOT NULL DEFAULT getdate();
# j4 @( U& i- T( Qend';
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则