我需要在所有数据库(同一实例)中为名为Requirements的表添加3个新列。我在net中搜索发现sp_MSforeachdb可用于在多个数据库上执行相同的查询,但找不到任何带有alter命令的示例。
提前致谢
答案 0 :(得分: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
答案 1 :(得分:1)
从mysql命令行:
ALTER TABLE database1.table_name ADD column_name column-name;
ALTER TABLE database2.table_name ADD column_name column-name;
..
答案 2 :(得分: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');
您也可以编写一个游标来循环遍历这些并执行它们,但我建议您查看正在执行的内容,并确保您没有更新错误的数据库。