在 AWS RDS SQL 服务器中使用嵌套数据库 Link 查询时出现问题
Issues while Using Nested DB Link queries in AWS RDS SQL Server
我有三个数据库服务器,希望在它们之间建立一个 Link 服务器连接到期刊。
- A - AWS RDS SQL 服务器数据库
- B - SQL AWS EC2 实例上的服务器数据库
- C - Exadata Oracle 服务器 - 本地
我有两个问题如下:
问题 1
任务是在数据库服务器A(SQL服务器)和数据库服务器C(Oracle)之间建立SQL服务器Link服务器连接。从服务器 A 到服务器 C 定义了所有网络防火墙和出站规则,但我仍然无法在两台服务器之间建立连接。
我收到以下错误:
TITLE: Microsoft SQL Server Management Studio
------------------------------
The test connection to the linked server failed.
------------------------------
ADDITIONAL INFORMATION:
An exception occurred while executing a Transact-SQL statement or batch. (Microsoft.SqlServer.ConnectionInfo)
------------------------------
The OLE DB provider "OraOLEDB.Oracle" has not been registered. (Microsoft SQL Server, Error: 7403)
For help, click: https://docs.microsoft.com/sql/relational-databases/errors-events/mssqlserver-7403-database-engine-error
------------------------------
BUTTONS:
OK
------------------------------
问题 2
作为解决方法,我尝试建立从服务器 A 到服务器 B,然后从服务器 B 到服务器 C 的链接服务器连接。解释如下:
- Link 服务器连接 1 (ABC) - 服务器 A (RDS SQL 服务器) 到服务器
B(AWS EC2 SQL 服务器)
- Link 服务器连接 2 (XYZ)- 服务器 B (AWS EC2 SQL 服务器)
服务器 C(Oracle Exadata On-prem)。服务器 B 有一个现有的
连接到服务器 C.
我尝试使用嵌套的 Link 服务器查询访问它。此查询在服务器 A
上执行
select * from OPENQUERY (ABC,' SELECT * FROM OPENQUERY (XYZ,''SELECT * FROM EMP'')')
以上查询有效并产生所需的结果。
但是当我尝试使用带有几个连接和 where 子句的复杂查询版本时,它会抛出错误。
查询如下:
SELECT * FROM OPENQUERY( ABC,'SELECT * FROM OPENQUERY
(XYZ,''
SELECT
c.emp_id
,c.emp_name
,e.emp_dept
FROM
emp_det c
JOIN emp e ON c.emp_id = e.emp_id
WHERE
c.emp_id = ''123456''
'')
')
错误信息
OLE DB provider "MSOLEDBSQL" for linked server "ABC" returned message "Deferred prepare could not be completed.".
Msg 8180, Level 16, State 1, Line 1
Statement(s) could not be prepared.
Msg 102, Level 15, State 1, Line 10
Incorrect syntax near '123456'.
我尝试在网上搜索解决方案,但没有找到任何可以帮助解决问题的方法。
如果有人能帮助我解决这些问题中的任何一个,我将不胜感激。
TIA
通过调整和平衡单引号解决了问题 2。
嵌套OPENQUERY的SQL语句将以双引号开头,where子句中的值需要用四对单引号括起来。
参考下面的工作查询:
SELECT * FROM OPENQUERY
( ABC,'
SELECT * FROM OPENQUERY(XYZ,''
SELECT
c.emp_id
,c.emp_name
,e.emp_dept
FROM
emp_det c
JOIN emp e ON c.emp_id = e.emp_id
WHERE
c.emp_id = ''''123456''''
'')')
我有三个数据库服务器,希望在它们之间建立一个 Link 服务器连接到期刊。
- A - AWS RDS SQL 服务器数据库
- B - SQL AWS EC2 实例上的服务器数据库
- C - Exadata Oracle 服务器 - 本地
我有两个问题如下:
问题 1
任务是在数据库服务器A(SQL服务器)和数据库服务器C(Oracle)之间建立SQL服务器Link服务器连接。从服务器 A 到服务器 C 定义了所有网络防火墙和出站规则,但我仍然无法在两台服务器之间建立连接。
我收到以下错误:
TITLE: Microsoft SQL Server Management Studio
------------------------------
The test connection to the linked server failed.
------------------------------
ADDITIONAL INFORMATION:
An exception occurred while executing a Transact-SQL statement or batch. (Microsoft.SqlServer.ConnectionInfo)
------------------------------
The OLE DB provider "OraOLEDB.Oracle" has not been registered. (Microsoft SQL Server, Error: 7403)
For help, click: https://docs.microsoft.com/sql/relational-databases/errors-events/mssqlserver-7403-database-engine-error
------------------------------
BUTTONS:
OK
------------------------------
问题 2
作为解决方法,我尝试建立从服务器 A 到服务器 B,然后从服务器 B 到服务器 C 的链接服务器连接。解释如下:
- Link 服务器连接 1 (ABC) - 服务器 A (RDS SQL 服务器) 到服务器 B(AWS EC2 SQL 服务器)
- Link 服务器连接 2 (XYZ)- 服务器 B (AWS EC2 SQL 服务器) 服务器 C(Oracle Exadata On-prem)。服务器 B 有一个现有的 连接到服务器 C.
我尝试使用嵌套的 Link 服务器查询访问它。此查询在服务器 A
上执行select * from OPENQUERY (ABC,' SELECT * FROM OPENQUERY (XYZ,''SELECT * FROM EMP'')')
以上查询有效并产生所需的结果。
但是当我尝试使用带有几个连接和 where 子句的复杂查询版本时,它会抛出错误。
查询如下:
SELECT * FROM OPENQUERY( ABC,'SELECT * FROM OPENQUERY
(XYZ,''
SELECT
c.emp_id
,c.emp_name
,e.emp_dept
FROM
emp_det c
JOIN emp e ON c.emp_id = e.emp_id
WHERE
c.emp_id = ''123456''
'')
')
错误信息
OLE DB provider "MSOLEDBSQL" for linked server "ABC" returned message "Deferred prepare could not be completed.".
Msg 8180, Level 16, State 1, Line 1
Statement(s) could not be prepared.
Msg 102, Level 15, State 1, Line 10
Incorrect syntax near '123456'.
我尝试在网上搜索解决方案,但没有找到任何可以帮助解决问题的方法。 如果有人能帮助我解决这些问题中的任何一个,我将不胜感激。
TIA
通过调整和平衡单引号解决了问题 2。
嵌套OPENQUERY的SQL语句将以双引号开头,where子句中的值需要用四对单引号括起来。
参考下面的工作查询:
SELECT * FROM OPENQUERY
( ABC,'
SELECT * FROM OPENQUERY(XYZ,''
SELECT
c.emp_id
,c.emp_name
,e.emp_dept
FROM
emp_det c
JOIN emp e ON c.emp_id = e.emp_id
WHERE
c.emp_id = ''''123456''''
'')')