2014-09-12 65 views
1

我需要能够加入到不同的数据库(在同一台服务器上),并且我需要加入的数据库名称取决于正在检查的记录。我有东西沿线T-SQL - 加入具有派生名称的数据库

SELECT * 
FROM orders o 
INNER JOIN orderdetail od ON od.okey = o.okey 
INNER JOIN scheduledetail scheddet on scheddet.odkey = od.odkey 
INNER JOIN schedules sched on sched.schedid = scheddet.schedid 
INNER JOIN databases db on db.dbdate = sched.releasedate 
INNER JOIN [db.dbname].detail det on det.odkey = od.odkey 

但是,据我所知,transact SQL不会允许这种连接语法。有任何想法吗?

+0

INNER JOIN上det.odkey = od.odkey dbname.schema.field DET – MelgoV 2014-09-12 13:30:53

+0

你得给用户[动态SQL](http://www.sommarskog.se /dynamic_sql.html) – SWeko 2014-09-12 13:31:16

+0

因此,对于dbname这个字段,所有这些dbs中的“Detail”表是否相同?我们在这里谈论多少个dbs? – Sean 2014-09-12 15:32:07

回答

0

如果所有的细节表都有相同的列,您可以创建一个包装所有细节的视图。

DECLARE @sql varchar(max); 

SELECT 
    @sql = COALESCE(@sql + ' UNION ALL ','CREATE VIEW unified_details AS ') 
+ 'SELECT *,'+QUOTENAME([dbname])+' AS [dbname] FROM '+QUOTENAME([dbname])+'.[dbo].[detail]' 
FROM databases; 

EXEC sp_executesql @sql; 

SELECT * 
FROM orders o 
INNER JOIN orderdetail od ON od.okey = o.okey 
INNER JOIN scheduledetail scheddet on scheddet.odkey = od.odkey 
INNER JOIN schedules sched on sched.schedid = scheddet.schedid 
INNER JOIN databases db on db.dbdate = sched.releasedate 
INNER JOIN unified_details det on det.odkey = od.odkey and db.dbname = det.dbname 
+0

有些非正统,但这种方法让我做我需要做的事在短期内。不幸的是,所涉及的数据的大小意味着我必须限制视图的范围,所以我仍然需要提出一个动态解决方案。 – rheinz 2014-09-12 20:33:05