如何创建从表读取的动态视图?

时间:2019-04-24 21:03:17

标签: sql sql-server

我有一台带有姐妹数据库的服务器。我目前有以下视图,这些视图从这些数据库中获取数据

SELECT UnId FROM [DatabaseOne].[dbo].Customers
UNION ALL
SELECT UnId FROM [DatabaseTwo].[dbo].Customers
UNION ALL
SELECT UnId FROM [DatabaseThree].[dbo].Customers

但是,我经常需要添加或删除数据库,因此静态视图似乎不是最佳解决方案。我已经有了一个包含所有姐妹数据库的表,如下所示。

DATDB

UnId | DSTABLE
1    | DatabaseOne
2    | DatabaseTwo
3    | DatabaseThree

如何创建读取此表的动态视图?

2 个答案:

答案 0 :(得分:2)

正如肖恩(Sean)明确指出的那样,视图不可能是动态的。

除了Sam的注释之外,您还可以执行其他操作,在您的DATDB表上放置一个TRIGGER,然后AFTER INSERT / UPDATE / DELETE生成并执行ALTER VIEW语句以更改视图以从最新值中进行选择在DATDB表中。

答案 1 :(得分:0)

考虑存储过程,该存储过程读取DATADB表并创建SELECT语法,例如,将其作为动态SQL运行

declare @SQL varchar(1000)
declare @table as table (Unid int, DSTABLE varchar(50))
INSERT INTO @table
select 1 as Unid, 'DatabaseOne' as DSTABLE union
select 2 as Unid, 'DatabaseTwo' as DSTABLE union
select 3 as Unid, 'DatabaseThree' as DSTABLE 



 SELECT @SQL = (STUFF((
        SELECT ' ' + ' SELECT Unid FROM ' + QUOTENAME(DSTABLE) + '.[dbo].[Customers] UNION ALL'
        FROM @table
        FOR XML PATH('')
        ), 1, 2, '')
    ) -- Multiple rows to one row

SELECT @SQL = SUBSTRING(@SQL, 0, LEN(@SQL)-9) -- remove last UNION ALL
--exec (@SQL)
--print @SQL

输出

SELECT Unid FROM [DatabaseOne].[dbo].[Customers] UNION ALL  
SELECT Unid FROM [DatabaseTwo].[dbo].[Customers] UNION ALL  
SELECT Unid FROM [DatabaseThree].[dbo].[Customers]