【发布时间】:2020-02-25 21:47:38
【问题描述】:
我有以下问题:我想在我的 SQL Server 上对多个数据库执行查询。每个客户都有一个单独的数据库。它们都具有完全相同的表,并且它们的名称相似。所以有一个数据库kde_01_Miller,然后是一个kde_02_Mueller等等......
我想在每个数据库中执行一个查询。
这是我尝试过的:
DECLARE @name VARCHAR(100) -- database name
DECLARE @dothis nvarchar(200)
DECLARE db_cursor CURSOR FOR
SELECT name
FROM master.dbo.sysdatabases
WHERE name like 'kde_0%'
order by name
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
set @dothis = 'use [' + @name + ']'
exec sp_executesql @dothis
/* Start query */
select description from dbo.basicdata
/* End query */
FETCH NEXT FROM db_cursor INTO @name
END
CLOSE db_cursor
DEALLOCATE db_cursor
问题是查询不能正常工作。 use 声明似乎不起作用。我为我拥有的每个数据库都得到了一个结果,但结果总是相同的,这取决于我当前正在查询的数据库。
我还尝试了以下方法,并且成功了:我这样做了,而不是我的 while 循环:
WHILE @@FETCH_STATUS = 0
BEGIN
set @dothis= 'select description from ' + QUOTENAME(@name) + '.dbo.basicdata'
exec sp_executesql @dothis
FETCH NEXT FROM db_cursor INTO @name
END
但我不喜欢这种方式,因为每个表都需要quotename(@name)。
如何使第一个示例工作?
【问题讨论】:
-
根据数量和您的特定需求,您可以创建一个本地注册组,将每个客户数据库的注册添加到该组中,右键单击该组选择新查询。结果窗口将在所有数据库上执行您的查询,提供单个结果集以及源注册名称。
标签: sql sql-server database tsql