Можно ли добавить столбец в несколько таблиц одновременно? - PullRequest
6 голосов
/ 25 января 2011

Я использую SQL Server.Я хочу добавить один столбец с именем [DateCreated] для нескольких таблиц.Возможно ли, чтобы с помощью одного оператора я мог добавить этот столбец ко всем таблицам в моей базе данных?

Я наткнулся на ответ Джо Стеффанели, в котором он предложил запрос, который в свою очередь возвращает строки, состоящие из операторов таблицы Alter.,Запрос выглядит следующим образом:

select 'alter table ' + quotename(s.name) + '.' + quotename(t.name) + ' add [DateModified] datetime'
    from sys.columns c
        inner join sys.tables t
            on c.object_id = t.object_id
        inner join sys.schemas s
            on t.schema_id = s.schema_id
        left join sys.columns c2
            on t.object_id = c2.object_id
                and c2.name = 'DateModified'
    where c.name = 'DateCreated'
        and t.type = 'U'
        and c2.column_id is null /* DateModified column does not already exist */ 

Есть ли способ выполнить возвращаемые строки?Извините за английский.

Ответы [ 4 ]

9 голосов
/ 25 января 2011

Вам, вероятно, нужно что-то подобное. Убедитесь, что скрипт выполняет то, что вы хотите, перед его запуском (добавляет ненулевой столбец со значением по умолчанию getdate())!

DECLARE @Dynsql nvarchar(max) 
SET @Dynsql = ''

SELECT @Dynsql = @Dynsql + '
alter table ' + QUOTENAME(SCHEMA_NAME(schema_id))+ '.' + QUOTENAME(name)  + 
' add [DateCreated] datetime not null default getdate()' 
FROM sys.tables
WHERE type='U' and object_id NOT IN (select object_id from sys.columns where name='DateCreated')


EXEC (@Dynsql)
1 голос
/ 16 сентября 2014

Эта хранимая процедура работает нормально

USE databaseName;
exec sp_msforeachtable 'alter table ? Add [DateCreated] datetime not null default getdate()';
0 голосов
/ 26 апреля 2016
declare @i int

set @i=1
while(@i<45)
begin
    declare @sql varchar(200)

    with TempTable as (select Row_number() over(order by stdID) as RowNo,* from SomeTable)

    select @sql= 'alter table Table'+(select Name from TempTable where RowNo=@i)+' add NewColumn int'

    exec (@sql)
    set @i=@i+1
end
0 голосов
/ 25 января 2011

Нет, нет единого утверждения, которое добавит столбец ко всем таблицам в вашей базе данных.

В следующий раз, пожалуйста, пометьте свой вопрос используемой СУБД.Если бы был способ, мы бы не смогли дать вам команду, не зная, какую систему базы данных вы используете.

...