Presumindo que as tabelas estarão todas no mesmo esquema e depois 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 escreveu uma versão superior aqui que você pode querer usar.
Outra maneira com 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)
Se você precisar levar em consideração a possibilidade de que a tabela não esteja em dbo
ou um esquema comum então você pode usar sp_msforeachdb
para recuperar as informações do esquema ao longo das linhas 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