【问题标题】:How can I relate two tables that are in different databases (SQL Server)?如何关联不同数据库(SQL Server)中的两个表?
【发布时间】:2016-09-17 06:50:29
【问题描述】:

我需要从另一个数据库的表中获取一个值;如果这些表在同一个数据库中,那将非常容易,但由于它们不是,所以事情变得复杂了。我试过这个:

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 架构/数据库访问其他数据库(架构、IOW CPSData)中的表。

更新 2

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

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

【问题讨论】:

  • 服务器名称PROSQL05数据库名称sa架构名称BIData & 表名PriceExceptionHistoryCSR 。如果以上信息正确,则不会出现该错误
  • 你尝试了什么?
  • @swe:显示的查询。
  • @Prdp:我假设我为 Connection (PROSQL05.sa.BIData) 选择的内容表明这些是这样的,对吗?
  • 几乎呼应了 Prdp 所说的 - 你确定你的数据库名称不是 cpsdatabidata 吗?因为目前您将这两个视为 模式名称 都使用名为 sa 的数据库 - 这似乎不太可能。

标签: sql-server linqpad


【解决方案1】:

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

<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 

【讨论】:

    【解决方案2】:

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

    • 一个错字
    • 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 
    

    【讨论】:

    • 这似乎更像是评论而不是答案。
    • 给定的信息是最好的事情......但我同意
    • 我意识到这是一个 SQL 错误;什么是“acl 问题”?
    • @B.ClayShannon - ACL 是访问控制列表。基本上他是在说“你确定用户有权限吗”。我知道事实上,如果是这种情况,您会收到完全不同的错误消息,所以我会忽略。
    • @Jamiec:用户是我,我可以访问任一数据库(BIData 或 CPSData),只要是我在 LINQPad 的连接下拉列表中选择的连接;它只是试图“混合和匹配”,这被证明是有问题的。
    【解决方案3】:
    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 并且你将架构名称放在原始查询中的数据库名称之前

    【讨论】:

    • 查看查询,第一个 (.) 之后的部分应该是数据库名称,第二个 (.) 之后是模式名称。如果您查看问题,则表示他正在尝试查询两个数据库,因此“sa”不能是数据库名称,而必须是查询名称
    【解决方案4】:

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

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

    【讨论】:

    • 这似乎无法回答问题,尽管这是有用(且正确!)的信息,但它更多的是评论而不是答案。当您获得更多代表时,您将能够评论其他用户的问题。
    猜你喜欢
    • 2022-01-23
    • 2014-04-24
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    • 2013-07-18
    相关资源
    最近更新 更多