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

Selecting data that could reside in many databases

这太复杂了(至少在我的脑海里),我无法正确地命名我的问题。

我需要从包含 OrderCustomerSupplier 的中央数据库连接到数百个数据库(每个 Supplier 一个) tables.

基本上中央数据库中的Supppliertable是这样的:

SupplierID | SupplierName | SupplierDatabaseName
1            Nestle         Nestle005
2            Mars           Mars001

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

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

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

在 Mars001 等供应商的数据库中,有一个 table 供该公司管理有关其产品的信息,例如:

ProductID | ProductName
100         Skittles

我需要做的是 return 客户的订单清单,以及 ProductName。这意味着我必须:

  1. Select 中央数据库的所有内容 Order table
  2. 以某种方式动态提供要在 JOIN 语句中使用的供应商数据库名称,以从该数据库中的产品 table 中获取 ProductName

最终输出应如下所示:

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

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

任何人都可以提出解决这个问题的方法吗?也许它不可能在单个查询中完成?

虽然这种类型的分区可能不是最好的,但您可能会坚持使用它。做你想做的事情的基本动态 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

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