回答

收藏

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

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

我正在使用SQL Server
0 z- z4 y( w. Q2005/2008。我需要向表中添加一列(如果尚不存在)。这将应用于给定数据库中的所有表。我希望我能早一点,但与此解决方案有关。0 V$ |1 x. N0 k; p& k  W0 m
如何才能做到这一点?
- \3 x+ H1 p" |# Y这是我所拥有的:
$ C" O$ O" _2 u* M% I2 F& m* JEXEC sp_MSforeachtable '
4 G9 S, ~# R- C. B9 ^! W- h    declare @tblname varchar(255);2 g) y7 J+ k, l7 I" A9 u
    SET @tblname =  PARSENAME("?",1);
# h- {, b, G* a& X+ p, u, }) R    if not exists (select column_name from INFORMATION_SCHEMA.columns 5 V; o" ^  X8 C- L7 t, _7 N4 J
                   where table_name = @tblname and column_name = ''CreatedOn'') 2 [- Q7 M, z4 Z; e/ H
    begin) o  q9 E6 r7 R& \0 s4 q  L6 p
        ALTER TABLE @tblname ADD CreatedOn datetime NOT NULL DEFAULT getdate();
+ l9 ~( N8 x1 V5 I    end* Z7 ]( Q% t3 A4 x! Q9 Y$ ^9 T
'4 c5 D! l# H+ S
但是我得到了错误:
2 y5 z4 v/ R4 {: e9 H# c* t* G/ e  h$ p, q
错误102:“ @ tblname”附近的语法不正确。’CreatedOn’附近的语法不正确。“( y5 O* ~& W& ~, {3 C' o+ Q- D
@tblname”附近的语法不正确。’CreatedOn’附近的语法不正确。…依此类推,针对每个表格。: q0 k6 T) f9 J, C" R/ K
& H; t6 r! {$ e9 b( M, m
               
4 X( ?6 L- `4 ]8 f1 C' x解决方案:! t/ k: w3 [7 c: t) _1 C
               
5 b, S7 T2 m% b: [+ \1 |5 W0 j% q3 W. k' K* q) A& e

9 f7 Y% e: o+ D0 s$ f- |                您不能在DDL中使用变量,例如@tableName。此外,将名称分成部分并忽略架构只会导致错误。您应该只在SQL批处理参数中使用“?”替换,然后依靠MSforeachtable替换:
7 U& Y: ]& Q  ^( j; y# U+ K2 cEXEC sp_MSforeachtable '
% c4 s7 n" X  j1 K+ jif not exists (select * from sys.columns
1 j# q! a8 e' w& ^% C               where object_id = object_id(''?'')& U; R$ A% u) k
               and name = ''CreatedOn'') - o$ c" R7 w$ d# O4 H# N
begin) [9 [+ S' b# Q( i) V3 U
    ALTER TABLE ? ADD CreatedOn datetime NOT NULL DEFAULT getdate();  r1 g8 q2 G& `, i6 ]2 W
end';
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则