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

Sql server 如何关联不同数据库(SQL Server)中的两个表?,sql-server,linqpad,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

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

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中)

错误208:无效的对象名称“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,IOW-CPSData)中的表

更新2 根据LINQPad的属性对话框Server=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

您可以尝试此操作。看起来您的架构名称是sa,并且在原始查询中将架构名称放在数据库名称之前

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

  • 打字错误
  • acl问题
您确定允许您的用户访问这两个数据库/模式吗

假设你的“关系”不是看上去的样子(很明显,根据你对这个问题的最后评论,它不是),试着:

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>

要使代码干净,请对另一个db的对象使用同义词


例如,如果为目标对象
prosql05.bidata.sa.priceexceptionhistorycsr
创建同义词
sa.priceexceptionhistorycsr
,则只能使用同义词引用目标。

服务器名称:
prosql05
,数据库名称:
sa
,架构名称:
BIData
&表名称:
priceexceptionhistorycrs
。如果以上信息是正确的,那么您将不会得到该错误您尝试了什么?@swe:显示的查询。@Prdp:我假设我为连接选择的内容(PROSQL05.sa.BIData)表明这些都是正确的,正确吗?几乎与Prdp所说的一致-您确定您的数据库名称不是
cpsdata
BIData
?因为目前,您将这两个名称视为模式名称,并使用名为
sa
的数据库-这似乎不太可能。这更像是一个注释,而不是一个答案。对于给定的信息,这是最好的选择。。。但我同意我意识到这是一个SQL错误;什么是“acl问题”?@B.ClayShannon-acl是访问控制列表。基本上,他说的是“你确定用户有权限吗?”。我知道事实上,如果是这种情况,您会收到完全不同的错误消息,因此我将忽略。@Jamiec:用户就是我,我可以访问任何数据库(BIData或CPSData),只要这是我在LINQPad的连接下拉列表中选择的连接;事实证明,这只是试图“混合匹配”,这是有问题的。查看查询,第一个(.)后面的部分应该是数据库名称,第二个(.)后面的部分应该是架构名称。如果你看这个问题,它是说他正在尝试查询两个数据库,因此“sa”不能是数据库名称,必须是查询名称。这似乎不能回答问题,尽管这是有用的(正确的!)信息,但它更像是一个注释,而不是答案。当你获得更多的代表,你将能够评论其他用户的问题。
<databasename>.<schemaname>.<tablename>
<schemaname>.<tablename>
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