选择可能驻留在许多数据库中的数据

时间:2015-05-17 00:47:29

标签: sql sql-server sql-server-2012 sql-server-2014

这是如此复杂(至少在我脑海中),我无法正确地标题。

我需要从包含SupplierOrderCustomer表的中央数据库连接数百个数据库(每个Supplier一个)。

基本上,中央数据库中的Suppplier表是这样的:

SupplierID | SupplierName | SupplierDatabaseName
1            Nestle         Nestle005
2            Mars           Mars001

它包含有关供应商的详细信息,最重要的是有关其数据库名称的详细信息。

当客户下订单时,它会进入中央数据库订单表,如下所示:

OrderID | CustomerID | SuppplierID | ProductID | Qty
1         1            2             100         5  

在供应商的数据库(如Mars001)中,有一个表格可供该公司管理有关其产品的信息,如下所示:

ProductID | ProductName
100         Skittles

我需要做的是返回客户的订单列表以及ProductName。这意味着我必须:

  1. 从中央数据库' Order
  2. 中选择所有内容
  3. 以某种方式动态提供供应商的数据库名称,以便在JOIN语句中使用以从该数据库的Products表中获取ProductName
  4. 最终输出应如下所示:

    OrderID | CustomerID | SupplierID | ProductID | ProductName
    1         1            2            100         Skittles
    

    我在某种程度上理解动态sql,我可以使用参数动态提供数据库名称。但这仅在参数值在查询中保持不变时才有效。这比这更复杂。

    有人可以请一个解决这个问题的方法吗?也许在单个查询中不可能做到这一点?

1 个答案:

答案 0 :(得分:3)

虽然这种类型的分区可能不是最好的,但也许你会坚持下去。实现你想要的基本动态SQL并不是那么难:

declare @sql nvarchar(max) 
select @sql = N'
    select o.orderid, o.customerid, s.supplierid, p.productid, p.productname 
    from [order] o 
    join Supplier s on o.SuppplierID = s.SupplierID 
    join ' + s.Supplierdatabasename + N'..product p on o.ProductID = p.productid'
from [order] o join Supplier s on o.SuppplierID = s.SupplierID

exec(@sql)

这会得到如下结果:

orderid     customerid  supplierid  productid   productname
----------- ----------- ----------- ----------- --------------------
1           1           2           100         Skittles

查询肯定可以改进,但它应该让您了解如何继续。