Frage

Ich muss 3 neue Spalten zu einer Tabelle mit dem Namen Anforderungen in allen Datenbanken (gleicher Instanz) hinzufügen. Ich habe im Netz gesucht, um SP_MSforeachDB zu finden, kann verwendet werden, um die gleiche Abfrage in mehreren Datenbanken auszuführen, aber kein Beispiel mit einem Änderungsbefehl finden kann.

Danke im Voraus

War es hilfreich?

Lösung

Vorausgesetzt, die Tabellen werden alle im selben Schema sein und dann verwenden 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 schrieb eine überlegene Version hier das Sie vielleicht verwenden möchten.

Ein anderer Weg mit dynamischem 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)

Wenn Sie die Möglichkeit berücksichtigen müssen, dass sich die Tabelle nicht befindet dbo oder ein gemeinsames Schema, dann können Sie verwenden sp_msforeachdb Um die Schemainformationen in der Reihe von Sachen abzurufen

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

Andere Tipps

Aus der MySQL -Befehlszeile:

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

Der folgende Code würde für jede Datenbank Befehle generieren:

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');

Sie könnten auch einen Cursor schreiben, um diese zu schleifen und diese auszuführen, aber ich würde empfehlen, zu sehen, was Sie ausführen, und sicherzustellen, dass Sie die falschen Datenbanken nicht aktualisieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top