我有1个SQL Server 2008实例,其中包含多个相同的数据库。 我希望在所有数据库上运行相同的查询(例如:向表中添加列)。 我希望使用包含数据库名称的数组。
如何在SQL Server中执行此操作?
感谢您的帮助
答案 0 :(得分:0)
您可以通过查询sys.databases获取所有数据库,然后在游标上使用动态sql语句,并使用当前值(即数据库名称)适当限定的select语句。
这是一个示例脚本,它将输出名称以“commerce”结尾的数据库的结果。修改它以插入临时表而不是选择
将是微不足道的DECLARE DBS CURSOR FOR
SELECT name
FROM sys.databases
WHERE name like '%Commerce'
DECLARE @DB SYSNAME
OPEN DBS
FETCH NEXT FROM DBS INTO @DB
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @SQL NVARCHAR(MAX)
SET @SQL = 'SELECT TOP 1 DB_NAME(), * FROM ' + @DB + '.dbo.dbversion ORDER BY ExecutionDate desc'
exec( @sql )
FETCH NEXT FROM DBS INTO @DB
END
CLOSE DBS
DEALLOCATE DBS
答案 1 :(得分:0)
EXEC sp_MSforeachdb @command
它没有记录,命令将需要检查它正在处理哪个数据库以排除那些你不想要的数据
答案 2 :(得分:0)
只需使用语法[dbname]。[schema]。[tablename]
,就可以跨多个数据库运行SQL。因此,您可以轻松地将动态SQL写入INSERT INTO [dbname]。[dbo]。[TableName],无论您想要什么。
您甚至可以使用此语法编写一个SQL查询来连接来自两个不同数据库的表。
在您的情况下,只需在字符串中构建SQL语句,然后调用EXEC执行它。您可以在顶部声明一个表变量并将数据库的名称插入其中,并在SQL查询中使用它来构建SQL字符串。或者使用适当的WHERE子句查询sys.databases以获取数据库名称。然后使用这些值为每个数据库构建和执行适当的SQL。