在 AWS RDS SQL 服务器中使用嵌套数据库 Link 查询时出现问题

Issues while Using Nested DB Link queries in AWS RDS SQL Server

我有三个数据库服务器,希望在它们之间建立一个 Link 服务器连接到期刊。

我有两个问题如下:

问题 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 服务器查询访问它。此查询在服务器 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''''
            '')')