我们正在将应用程序从 Oracle 迁移到 SQL Server。供应商负责大部分迁移工作,但有一件是内部开发的,我遇到了麻烦。
Oracle 上的旧应用程序有一个收集特定数据的过程,然后另一个过程将该数据插入到我们收入系统(不同的 Oracle 服务器)中的暂存表中。这是一个通过 Oracle 公共数据库链接的 Oracle 过程。
在 SQL Server 中,我试图使用 SQL Server 的链接服务器重写这个过程。我已经创建了与收入系统的链接服务器连接,它可以通过该链接进行连接。
在 SQL*Plus 中,我可以作为该用户发出此语句:
select * from rs.rs_myapp;
我得到了结果。(rs 是收入系统用户,而不是我连接的用户。rs_MyApp 表是我们数据在他们系统中的暂存表。)
但是如果我尝试在 SQL Server 中执行此操作:
select * from [rstest-Link]..rs.rs_myapp
我收到这条消息:
消息 7314、级别 16、状态 1、第 50 行链接服务器“rstest-Link”的 OLE DB 提供程序“OraOLEDB.Oracle”不包含表“rs”、“rs_myapp”。该表不存在或当前用户对该表没有权限。
但是,我可以这样做:
select * from openquery([rstest-Link], 'select count(*) from rs.rs_myapp')
这会返回结果,表明链接确实有效。
但是,由于 7314 错误,我无法完成 SQL Server 过程。该程序非常基本,其中只有一行代码:
Insert Into [rstest-Link]..rs.rs_myapp (ACCOUNT_NUMBER, FROM_DATE, TO_DATE,
Data1, Data2, SAMPLE_DATE, Content1, Content2)
select ACCOUNT_NUMBER, FROM_DATE, TO_DATE, MyData1, MyData2, SAMPLE_DATE, MyContent1, MyContent2
FROM dbo.RS_INTERFACE;
但如果不解决 7314 错误,就无法创建过程。
那么我该怎么做呢?我是否必须使用游标并为每一行发出某种代码,例如:
INSERT OPENQUERY ([rstest-Link], 'SELECT ... FROM ...')
VALUES ('...');
Oracle 使用区分大小写的目录,并通过在 DDL 和 DML 中默默地将非引号标识符转换为全部大写来向您隐藏这个丑陋的事实。
您的表的名称实际上是 RS.RS_MYAPP,SQL Server 可能会将标识符作为“rs”、“rs_myapp”发送给 Oracle,这在 Oracle 中会失败。
所以试试
从 [rstest-Link]..RS.RS_MYAPP 选择 *
首先:我将尝试回答问题本身:当您直接引用 ORACLE 表时,这
[LinkedServerName]..[Schema].[Table]
是您正在使用的方法吗?如果是这样,请确保通过链接服务器登录的用户在 ORACLE 端设置为使用 RPC Out。(通过链接服务器设置)
^^编辑:忽略以上内容。大卫的回答很准确。
现在有一些想法:
几年来,我一直在通过链接服务器使用 SQL Server --> ORACLE,我可以肯定地说,为了纯粹的易用性和稳定性,在 ORACLE SQL/PL/SQL 中编写查询并使用 OPENQUERY( ) 对我来说比使用链接服务器的表和用 T-SQL 编写查询要好得多。
为什么?
1) 好吧,当您用 ORACLE SQL 编写它并通过
OPENQUERY
. SQL Server 只是等待查询完成并接受结果。2) 您可以在ORACLE 端优化查询,完成后就在SQL Server 端使用它。SQL Server 的优化器只告诉我100% - 远程查询并保留它。
3) 如果您不必筛选 T-SQL,问题(权限、优化等)就更容易诊断。
4) 您仍然可以在返回结果时使用 T-SQL 操作结果(在外部 SELECT 语句中。这意味着您可以同时使用 Oracle 和 T-SQL Native 函数来处理您的查询 。
TRUNC
,,,,,SUBSTR
它们都是可用的。INSTR
CHARDINDEX
当我第一次开始不得不使用它从 ORACLE 进行查询时,我才精通 T-SQL,让我告诉你,当我学习 PL/SQL 后,我就开始
OPENQUERY
在 SQL Server 的语句中使用它。职责分离的概念也适用于这些。当他们不打架时,他们会更快乐。