我需要在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次?
答案 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架构):
创建一些主数据库并在此创建表,其中包含所有其他数据库的列表 - 主要是数据库名称,但您可以包含描述差异的任何其他信息(并在查询生成期间使用此数据) )。您可以添加更多(或删除)数据库"定义"这里。
创建存储过程,该过程将迭代主表并动态生成查询
使用sp_exec