添加一列,如果它不存在所有表?

我正在使用SQL Server 2005/2008。 如果它还不存在,我需要向表中添加一列。 这将适用于给定数据库中的所有表。 我希望我很接近,但是我遇到了这个解决方案的问题。

如何才能做到这一点?

以下是我的:

EXEC sp_MSforeachtable '
    declare @tblname varchar(255);
    SET @tblname =  PARSENAME("?",1);

    if not exists (select column_name from INFORMATION_SCHEMA.columns 
                   where table_name = @tblname and column_name = ''CreatedOn'') 
    begin
        ALTER TABLE @tblname ADD CreatedOn datetime NOT NULL DEFAULT getdate();
    end
'

但我收到错误:

错误102:'@tblname'附近的语法不正确。 'CreatedOn'附近语法不正确。 “@tblname”附近的语法错误。 'CreatedOn'附近语法不正确。 ...等等,每个表。


你不能在DDL中使用变量,比如@tableName。 此外,将名称拼凑成部分并忽略模式只会导致错误。 您应该只使用SQL批处理参数中的''''替换,并依靠MSforeachtable替换:

EXEC sp_MSforeachtable '
if not exists (select * from sys.columns 
               where object_id = object_id(''?'')
               and name = ''CreatedOn'') 
begin
    ALTER TABLE ? ADD CreatedOn datetime NOT NULL DEFAULT getdate();
end';

你需要混合一些动态SQL。 这应该工作:

EXEC sp_MSforeachtable '
    declare @tblname varchar(255);
    SET @tblname =  PARSENAME("?",1);
    declare @sql nvarchar(1000);

    if not exists (select column_name from INFORMATION_SCHEMA.columns 
                   where table_name = @tblname and column_name = ''CreatedOn'') 
    begin
        set @sql = N''ALTER TABLE '' +  @tblname + N'' ADD CreatedOn datetime NOT NULL DEFAULT getdate();''
        exec sp_executesql @sql
    end
'

也许这样:

EXEC sp_MSforeachtable '
    declare @tblname varchar(255);
    SET @tblname =  PARSENAME("?",1);

    if not exists (select column_name from INFORMATION_SCHEMA.columns 
                   where table_name = @tblname and column_name = ''CreatedOn'') 
    begin
        ALTER TABLE [?] ADD CreatedOn datetime NOT NULL DEFAULT getdate();
    end
'

甚至像这样:

EXEC sp_MSforeachtable '
    if not exists (select column_name from INFORMATION_SCHEMA.columns 
                   where table_name = ''?'' and column_name = ''CreatedOn'') 
    begin
        ALTER TABLE [?] ADD CreatedOn datetime NOT NULL DEFAULT getdate();
    end
'
链接地址: http://www.djcxy.com/p/76317.html

上一篇: Add a column if it doesn't exist to all tables?

下一篇: Change a Nullable column to NOT NULL with Default Value