如何创建表值函数或视图,以返回针对多个数据库运行的查询结果

时间:2011-10-31 17:20:22

标签: sql-server sp-msforeachdb

我需要创建一个视图或表值函数,该函数从对数据库的动态列表(存储在表中)中运行的查询返回一个结果集。所有数据库都具有相同的结构,并且view / tvf应该包含database_table中每个数据库的所有查询的联合等效项。所有这一切的大图是我需要通过ODBC提供此查询的结果。

经过大量的在线观察后,我想出了一些潜在的解决方案,没有一个完全符合我想要完成的任务。

我要研究的第一件事是为每个不同的数据库选择一个视图,所有视图都联合在一起。这完美地运作,除了它尽可能远离我可能想象的可维护性这一事实。我将有25-100种这样的多数据库查询,所有这些查询都必须针对不断变化的数据库集运行。

我仍然在寻找可能使用这种方法,并使存储过程动态地为我创建视图,但这仍然不是很有用,因为我被要求使整个过程免提。这样做需要有人在我们尝试通过ODBC连接到视图之前触发视图更新。如果可能的话,我想避免这种情况。

我调查的第二件事让我更接近我所需要的东西。我使用了sp_msforeachdb存储过程,检查数据库是否在列表中,如果是,我将查询结果添加到表变量中。这工作得很好,但问题是动态sql使我无法将其包装到表值函数或视图中...

Declare @RETURNTABLE Table(variable1 varchar(20), variable 2 varchar(30))  
INSERT INTO @RETURNTABLE 
exec sp_msforeachdb 'IF "?" IN (SELECT DatabaseName FROM DatabaseList) BEGIN     SELECT "?" [DatabaseName], variable1 , variable2 from [?].dbo.myTable END'  
SELECT * FROM @DBINFO

从ms ssms的查询中运行它时效果非常好,但正如我所说的那样,将它置于视频或tvf中已证明超出了我的能力。据我所知,动态SQL排除了tvf的使用,并且视图无法使用变量。

是否有某些方法可以通过ODBC提供上述代码的结果。是否有一种我缺少的替代解决方案?

1 个答案:

答案 0 :(得分:2)

据我所知,使用动态SQL的存储过程是你唯一的选择。