从多表和多数据库中选择

时间:2018-11-17 09:45:32

标签: sql tsql

我需要做类似的事情:

SELECT    data, hour, user, 
FROM         [dbx].dbo._datamodel AS db0
UNION
SELECT    data, hour, user, 
FROM         [dby].dbo._datamodel AS db1
UNION
SELECT    data, hour, user, 
FROM         [dbz].dbo._datamodel AS db02
UNION
...

我们必须对许多DDBB进行此操作,并且我们正在寻找对具有条件的每个DB自动执行此操作的方法。 我们不想添加UNION并每次都为每个数据库选择。

任何人都有建议或想法怎么做?

2 个答案:

答案 0 :(得分:0)

我认为您正在寻找DynamicSQL

DECLARE @SQL NVARCHAR(MAX) = N'SELECT data, hour, user FROM ';

SELECT @SQL = @SQL + [name] + '.dbo._datamodel UNION SELECT * FROM '
FROM master.dbo.sysdatabases 
WHERE dbid > 4 ; --ReportServer and ReportServerTempDB  with dbid 5 and 6
SET @SQL = LEFT(@SQL, LEN(@SQL) - 21);
SELECT @SQL;
--EXECUTE sp_executesql @SQL;

答案 1 :(得分:0)

我只需在具有union的标准数据库中创建一个视图:

create view v_datamodel as
    select . . .
    union
    . . .;

(旁注:如果您确实只想使用union all,请使用它。union会产生很多额外的开销。)

如果您的数据库集是固定的,那么您只需创建一次视图即可-对其进行设置并忘记它。

如果要添加和删除数据库,则需要执行相应的过程。此过程可以更新视图,也许可以使用另一个答案中建议的动态SQL。或者,您可能会在sysdatabases之外的其他位置找到适当的数据库列表。

如果数据库是“临时”创建的,则可以使用DDL触发器。我不确定是否可以在create database上定义它们,但是在每个数据库中,都可以检查“数据模型”表的创建。