2013-11-07 4 views
0

Мне нужно добавить 3 новых столбца в таблицу с именем Требования во всех базах данных (одного и того же экземпляра). Я искал в сети, чтобы найти sp_MSforeachdb, который можно использовать для выполнения одного и того же запроса в нескольких базах данных, но не смог найти какой-либо пример с командой alter.Добавить столбцы в нескольких базах данных

Заранее спасибо

ответ

3

Предположив таблицы будут все в той же самой схеме, а затем с помощью sp_msforeachdb

EXEC sp_msforeachdb ' 
    IF DB_ID(''?'') > 4 
    BEGIN 
     IF EXISTS(SELECT 1 FROM [?].INFORMATION_SCHEMA.TABLES 
        WHERE TABLE_NAME=''Requirements'' AND TABLE_SCHEMA=''dbo'' 
        AND TABLE_TYPE=''BASE TABLE'') 
     BEGIN 
      ALTER TABLE [?].dbo.Requirements 
      ADD col1 INT, col2 INT, col3 INT 
     END 
    END  
' 

Aaron Bertrand написал превосходную версию here, что вы можете захотеть использовать.

Другой способ с динамическим SQL

DECLARE @sql VARCHAR(MAX) = CAST((SELECT 'IF EXISTS(SELECT 1 FROM [' + name + '].INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME=''Requirements'' AND TABLE_SCHEMA=''dbo'' AND TABLE_TYPE=''BASE TABLE'')' + CHAR(10) 
              + ' ALTER TABLE [' + name + '].[dbo].[Requirements] ADD Col1 INT, Col2 INT, Col3 INT' + CHAR(10) + CHAR(10) 
            FROM master.sys.databases 
            WHERE database_id > 4 
            FOR XML PATH('')) AS NVARCHAR(MAX)) 

PRINT @sql 
--EXEC(@sql) 

Если вы должны принять во внимание возможность того, что таблица не dbo или общей схемы, то вы можете использовать sp_msforeachdb для получения информации о схеме вдоль линий

CREATE TABLE ##tmp (DatabaseName SYSNAME, SchemaName SYSNAME, TableName SYSNAME) 

EXEC sp_msforeachdb ' 
    IF DB_ID(''?'') > 4 
    BEGIN 
     INSERT INTO ##tmp (DatabaseName, SchemaName, TableName) 
     SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME 
     FROM [?].INFORMATION_SCHEMA.TABLES 
     WHERE TABLE_NAME = ''Requirements'' 
     AND TABLE_TYPE=''BASE TABLE'' 
    END  
' 

DECLARE @sql VARCHAR(MAX) = CAST((SELECT 'ALTER TABLE [' + DatabaseName + '].[' + SchemaName + '].[' + TableName + '] ADD Col1 INT, Col2 INT, Col3 INT' + CHAR(10) + CHAR(10) 
            FROM ##tmp 
            FOR XML PATH('')) AS NVARCHAR(MAX)) 

PRINT @sql 
--EXEC(@sql) 

DROP TABLE ##tmp 
0

Начиная с MySQL командной строки:

ALTER TABLE database1.table_name ADD column_name column-name; 
ALTER TABLE database2.table_name ADD column_name column-name; 
.. 
+1

У меня есть более 100 баз данных, поэтому мне нужен один запрос t-sql для обновления всех баз данных одновременно. Я полагаю, что sp_MSforeachdb можно использовать, но не уверен, как его использовать. –

1

Следующий код будет генерировать команды для каждой базы данных:

select 'ALTER TABLE [' + d.name + '].[dbo].[table_name] ADD column_name column-name;' as cmd 
from sys.databases d 
where d.name NOT IN ('tempdb', 'msdb', 'master','model'); 

Вы также можете написать курсор петлю над ними и выполнить их, но я бы посоветовал посмотреть, что вы выполняете, и убедиться, что вы не обновляете неправильные базы данных.

 Смежные вопросы

  • Нет связанных вопросов^_^