我需要做类似的事情:
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
并每次都为每个数据库选择。
任何人都有建议或想法怎么做?
答案 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
上定义它们,但是在每个数据库中,都可以检查“数据模型”表的创建。