SQL查询多个数据库

时间:2015-05-30 14:11:06

标签: sql-server

我需要在SQL Server上运行SELECT查询并返回从同一服务器上的多个数据库中提取的信息。我有以下,可以工作:

SELECT [Name], [Nationality]
FROM [dbtest].[dbo].[Staff]
WHERE Nationality = 'Canadian'

Union all

SELECT [Name], [Nationality]
FROM [dbtest2].[dbo].[Staff]
WHERE Nationality = 'Canadian'

etc..

问题是我要查询2000个数据库,将来几乎肯定会添加它,这意味着查询需要编辑。

我真正需要的是数据库名称的通配符。

即:

*.[dbo].[Staff] 

但这给了我一个错误。即使它有效,并非所有数据库都有相同的表,所以很可能会出错。

任何方式我都可以这样做而无需输入上述例子2000次?

2 个答案:

答案 0 :(得分:3)

您可以动态构建语句

DECLARE @Query varchar(max) = ''

SELECT @Query = COALESCE(@Query + ' UNION ALL ', '') + 'SELECT [Name], [Nationality] FROM [' + TABLE_CATALOG+'].dbo.[Staff] WHERE Nationality = ''Canadian'''
FROM information_schema.tables 
WHERE table_name = 'Staff'

SET @Query = STUFF(@Query, CHARINDEX('UNION ALL', @Query), 10, '')

PRINT @Query

EXEC(@Query)

答案 1 :(得分:2)

这样做的一种方法是即时生成查询。 通过在@Yosi答案中查询information_schema DMV或使用您自己的元数据表(如果表格在不同的数据库中可以有不同的名称,或者表格中有任何其他重大差异&#39 ; s架构):

  1. 创建一些数据库并在此创建表,其中包含所有其他数据库的列表 - 主要是数据库名称,但您可以包含描述差异的任何其他信息(并在查询生成期间使用此数据) )。您可以添加更多(或删除)数据库"定义"这里。

  2. 创建存储过程,该过程将迭代主表并动态生成查询

  3. 使用sp_exec

  4. 执行查询