Добавить столбец, если он не существует для всех таблиц? - PullRequest
28 голосов
/ 28 февраля 2011

Я использую 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'.... и так далее для каждой таблицы.

Ответы [ 3 ]

27 голосов
/ 28 февраля 2011

Вы не можете использовать переменные, такие как @tableName, в DDL.Кроме того, разбиение имени на части и игнорирование схемы могут привести только к ошибкам.Вам следует просто использовать замену ''? '' В параметре пакета 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';
4 голосов
/ 28 февраля 2011

Вам нужно будет добавить немного динамического 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
'
0 голосов
/ 28 февраля 2011

Может быть так:

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
'
...