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

B. *_*non 3 sql-server linqpad

我需要从另一个数据库中的表中获取一个值; 如果表位于同一个数据库中,那将非常简单,但由于它们不是,因此使问题复杂化.我试过这个:

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 
Run Code Online (Sandbox Code Playgroud)

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

错误208:无效的对象名称"sa.BIData.PriceExceptionHistoryCSR".

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

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

UPDATE

我改变了我的尝试:

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
Run Code Online (Sandbox Code Playgroud)

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

这对我来说更有意义,但我仍然需要知道如何从BIData架构/数据库访问其他数据库(Schema,IOW CPSData).

更新2

根据LINQPad的属性对话框Server = PROSQL05,User name = sa和Database = BIData.

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

Jam*_*iec 6

在寻址数据库时,您始终必须使用此表单

<servername>.<databasename>.<schemaname>.<tablename>
Run Code Online (Sandbox Code Playgroud)

如果您的连接位于同一台服务器上,则可以省略第一部分,而不是

<databasename>.<schemaname>.<tablename>
Run Code Online (Sandbox Code Playgroud)

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

<schemaname>.<tablename>
Run Code Online (Sandbox Code Playgroud)

但是让我们备份,你试图访问同一台服务器上的另一个数据库.这意味着您可以省略其中一个数据库,另一个必须指定.我将假设所有表都在模式中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 
Run Code Online (Sandbox Code Playgroud)