【发布时间】:2014-07-26 17:03:06
【问题描述】:
我有 1 个带有多个相同数据库的 SQL Server 2008 实例。 我希望在所有数据库上运行相同的查询(例如:向表中添加列)。 我希望使用包含数据库名称的数组。
如何在 SQL Server 中执行此操作?
感谢您的帮助
【问题讨论】:
标签: sql-server sql-server-2008
我有 1 个带有多个相同数据库的 SQL Server 2008 实例。 我希望在所有数据库上运行相同的查询(例如:向表中添加列)。 我希望使用包含数据库名称的数组。
如何在 SQL Server 中执行此操作?
感谢您的帮助
【问题讨论】:
标签: sql-server sql-server-2008
您可以使用语法 [dbname].[schema].[tablename] 跨多个数据库运行 SQL
因此您可以轻松编写动态 SQL 到 INSERT INTO [dbname].[dbo].[TableName] 任何您想要的。
您甚至可以编写一个 SQL 查询,使用这种语法连接来自两个不同数据库的表。
在您的情况下,只需在字符串中构建 SQL 语句,然后调用 EXEC 来执行它。您可以在顶部声明一个表变量并将数据库的名称插入其中,然后在 SQL 查询中使用它来构建 SQL 字符串。或者使用适当的 WHERE 子句查询 sys.databases 以获取数据库名称。然后使用这些值为每个数据库构建和执行适当的 SQL。
【讨论】:
EXEC sp_MSforeachdb @command
它没有记录,该命令将需要检查它正在处理哪个数据库以排除您不想要的数据库
【讨论】:
您可以通过查询 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
【讨论】: