回答

收藏

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

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

我正在使用SQL Server
& J. P- Q) O7 a2005/2008。我需要向表中添加一列(如果尚不存在)。这将应用于给定数据库中的所有表。我希望我能早一点,但与此解决方案有关。+ c$ o$ K! m$ j$ X2 o- i
如何才能做到这一点?4 d$ }# {' _# f' Z9 b
这是我所拥有的:
2 |% U% F. r& {9 TEXEC sp_MSforeachtable ', `5 N4 M5 i* h, R' ]4 Q! Z4 i
    declare @tblname varchar(255);
0 b2 {; I6 j0 O) h    SET @tblname =  PARSENAME("?",1);
6 V9 `9 o# t  f    if not exists (select column_name from INFORMATION_SCHEMA.columns 8 i+ F. L( G  q& P( i+ D: @
                   where table_name = @tblname and column_name = ''CreatedOn'') ; W, ?* H$ Q; n  H
    begin/ S" F; W3 t5 M! O( j
        ALTER TABLE @tblname ADD CreatedOn datetime NOT NULL DEFAULT getdate();7 e1 `  j; S8 U  C" r3 E8 D) t
    end
) q* {. m) F& L5 s'- s: j/ w$ G) k, ~* J  a4 A. h
但是我得到了错误:: Z' T6 G" s' @; |& e4 Q

% T: [% g1 ^, N- }! S错误102:“ @ tblname”附近的语法不正确。’CreatedOn’附近的语法不正确。“* }- g, \; T5 ^/ a
@tblname”附近的语法不正确。’CreatedOn’附近的语法不正确。…依此类推,针对每个表格。
% ^: r8 H5 I" Y8 n- `9 B
" ^0 Y" X1 @: y2 x' u) d
                $ C8 u4 j0 v+ y: r* ?+ m3 T
解决方案:
& j! _1 M" n1 Q% m5 a6 }1 ^               
$ |5 A1 ]; t  Y1 ]8 F1 o: Z+ p( M# ?! s2 @
  C" _6 [1 C  D4 {
                您不能在DDL中使用变量,例如@tableName。此外,将名称分成部分并忽略架构只会导致错误。您应该只在SQL批处理参数中使用“?”替换,然后依靠MSforeachtable替换:1 }3 j* `/ H6 B
EXEC sp_MSforeachtable '
% e, O/ m4 q" w+ h6 aif not exists (select * from sys.columns , O3 ~3 s( N% ?& A$ }& B( P& L
               where object_id = object_id(''?'')/ D" u' t' T& ^- ]- q! A4 p
               and name = ''CreatedOn'') 9 f" V: @9 i; B" ]! z$ h7 S
begin
1 M2 |; w0 i, X    ALTER TABLE ? ADD CreatedOn datetime NOT NULL DEFAULT getdate();
2 `3 `! t% ~1 S& ^end';
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则