Pregunta

Necesito agregar 3 columnas nuevas a una tabla con nombre de requisitos en todas las bases de datos (de la misma instancia). Busqué en la red para encontrar SP_MSFORECHDB se puede usar para ejecutar la misma consulta en múltiples bases de datos, pero no pude encontrar ningún ejemplo con un comando ALTER.

Gracias por adelantado

¿Fue útil?

Solución

Presumir que las tablas estarán en el mismo esquema y luego usando 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 escribió una versión superior aquí que es posible que desee usar.

Otra forma con SQL dinámico

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)

Si tiene que tener en cuenta la posibilidad de que la tabla no esté en dbo o un esquema común, entonces puedes usar sp_msforeachdb para recuperar la información del esquema en la línea de

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

Otros consejos

Desde la línea de comando mysql:

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

El siguiente código generaría comandos para cada base de datos:

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

También puede escribir un cursor para recurrir a estos y ejecutarlos, pero aconsejaría a mirar lo que está ejecutando y asegurarse de que no actualice las bases de datos incorrectas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top