我需要创建一个视图或表值函数,该函数从对数据库的动态列表(存储在表中)中运行的查询返回一个结果集。所有数据库都具有相同的结构,并且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提供上述代码的结果。是否有一种我缺少的替代解决方案?
答案 0 :(得分:2)
据我所知,使用动态SQL的存储过程是你唯一的选择。