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

时间:2016-09-14 15:00:15

标签: 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 

...但是得到错误的消息(在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,User name = sa,Database = BIData。

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

4 个答案:

答案 0 :(得分:6)

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

<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 

答案 1 :(得分:1)

googeling你的错误消息显示,这不是一个linqpad消息,而是一个sql-server-error。 因此,您的查询中似乎存在错误。

我认为有一个
  • 一个错字
  • 一个问题

您确定允许您的用户访问这两个数据库/架构吗?

假设你的&#34;连接&#34;不是它看起来的样子(显然,根据你对问题的最后评论,不是),试试看:

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 

答案 2 :(得分:0)

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,并且你将模式名称放在原始查询中的数据库名称之前

答案 3 :(得分:0)

要使代码清晰,请对另一个数据库的对象使用同义词

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

相关问题