如何关联不同数据库(SQL 服务器)中的两个表?

How can I relate two tables that are in different databases (SQL Server)?

我需要从另一个数据库中的 table 中获取一个值;如果 table 位于同一个数据库中,那将非常容易,但由于它们不在同一个数据库中,这会使事情复杂化。我试过这个:

SELECT TOP 8 prosql05.sa.cpsdata.M.membername, 
             P.* 
FROM   prosql05.sa.bidata.priceexceptionhistorycsr P 
       JOIN prosql05.sa.cpsdata.members M 
         ON P.memberno = M.memberno 
WHERE  invoicedate BETWEEN '2016-09-04' AND '2016-09-10' 
ORDER  BY invoicedate 

...但收到错误消息(在 LINQPad 中),

Error 208: Invalid object name 'sa.BIData.PriceExceptionHistoryCSR'.

我很确定这是可能的(因为它们都在 PROSQL05 上),但是怎么做呢?

LINQPad中选择的连接是“PROSQL05.sa.BIData

更新

我已经改变了我的尝试:

select top 8 M.MemberName, P.* 
from PriceExceptionHistoryCSR P, PROSQL05.sa.CPSData M
where InvoiceDate between '2016-09-04' and '2016-09-10'
and M.MemberNo = P.MemberNo
order by invoicedate

...现在得到,“错误 208:对象名称无效 'PROSQL05.sa.CPSData'。

这对我来说更有意义,但我仍然需要知道如何从 BIData schema/database.[=14 访问其他数据库(Schema,IOW CPSData)中的 table =]

更新 2

根据 LINQPad 的属性对话框,服务器 = PROSQL05,用户名 = sa,数据库 = BIData。

那么这些知识如何影响 SQL 的结构?

SELECT TOP 8 prosql05.cpsdata.sa.M.membername, 
             P.* 
FROM   prosql05.bidata.sa.priceexceptionhistorycsr P 
       JOIN prosql05.cpsdata.sa.members M 
         ON P.memberno = M.memberno 
WHERE  invoicedate BETWEEN '2016-09-04' AND '2016-09-10' 
ORDER  BY invoicedate

你可以尝试 this.Looks 就像你的架构名称是 sa 并且你在原始查询中将你的架构名称放在你的数据库名称之前

使用谷歌搜索您的错误消息显示,这不是 linqpad 消息,而是 sql-server-error。 因此,您的查询中似乎有错误。 我想,有一个

  • 打字错误
  • acl 问题

您确定您的用户可以访问这两个 databases/schemata 吗?

假设您的 "connection" 不是看起来的样子(显然,根据您对问题的最后评论,不是),请尝试:

SELECT TOP 8 M.membername, 
             P.* 
FROM   priceexceptionhistorycsr P 
       JOIN prosql05.cpsdata.dbo.members M 
         ON P.memberno = M.memberno 
WHERE  invoicedate BETWEEN '2016-09-04' AND '2016-09-10' 
ORDER  BY invoicedate 

在寻址数据库时,您总是必须使用这种形式

<servername>.<databasename>.<schemaname>.<tablename>

如果您的连接在同一台服务器上,您可以省略第一部分,留下

<databasename>.<schemaname>.<tablename>

如果您连接到同一个数据库,您可以再次省略第一部分

<schemaname>.<tablename>

但是让我们备份一下,您正试图访问同一台服务器上的另一个数据库。这意味着您可以省略其中一个数据库,而必须指定另一个数据库。我将假设您所有的表都在架构 dbo 中,可能 就是这种情况。

如果您的连接直接连接到 bidata

,您应该这样查询
SELECT TOP 8 M.membername, 
             P.* 
FROM   dbo.priceexceptionhistorycsr P 
       JOIN cpsdata.dbo.members M 
         ON P.memberno = M.memberno 
WHERE  invoicedate BETWEEN '2016-09-04' AND '2016-09-10' 
ORDER  BY invoicedate 

为了使您的代码干净,对另一个数据库的对象使用同义词

例如,如果您为目标对象 prosql05.bidata.sa.priceexceptionhistorycsr 创建一个同义词 sa.priceexceptionhistorycsr,您可以仅使用同义词引用目标。