如何关联不同数据库(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
,您可以仅使用同义词引用目标。
我需要从另一个数据库中的 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
,您可以仅使用同义词引用目标。