SQL到Oracle链接服务器Openquery检索单行

SQL到Oracle链接服务器Openquery检索单行,sql,sql-server,oracle,linked-server,Sql,Sql Server,Oracle,Linked Server,我使用OpenQuery将Oracle表中的行集获取到我的SQL Server中。然后,我发现有一种称为OPENROWSET的方法来获取所有行 但这对我不起作用 SELECT a.* FROM OPENROWSET('MSDASQL', 'DRIVER={SQL Server};SERVER=INDIANBANK;UID=ags;PWD=mypass', 'Select * From ATM_PROGNOSIS.IR_ATMMON_AGS') AS a 错误:- OLE DB pr

我使用
OpenQuery
将Oracle表中的行集获取到我的SQL Server中。然后,我发现有一种称为
OPENROWSET
的方法来获取所有行

但这对我不起作用

SELECT a.*
FROM OPENROWSET('MSDASQL',
   'DRIVER={SQL Server};SERVER=INDIANBANK;UID=ags;PWD=mypass',
   'Select * From ATM_PROGNOSIS.IR_ATMMON_AGS') AS a
错误:-

OLE DB provider "MSDASQL" for linked server "(null)" returned message "[Microsoft][ODBC SQL Server Driver][DBNETLIB]ConnectionOpen (Connect()).".
OLE DB provider "MSDASQL" for linked server "(null)" returned message "[Microsoft][ODBC SQL Server Driver][DBNETLIB]SQL Server does not exist or access denied.".
Msg 7303, Level 16, State 1, Line 1
Cannot initialize the data source object of OLE DB provider "MSDASQL" for linked server "(null)".
我的DSN名称:印度银行

我已使用Microsoft OLE DB Provider for ODBC驱动程序创建链接服务器以连接到oracle(oracle DB位于远程服务器上)

我的DSN显示测试连接成功。与我的链接服务器相同

当我执行以下查询时,它只检索一行

我的链接服务器代码:-

EXEC master.dbo.sp_addlinkedserver @server = N'INDIANBANK', @srvproduct=N'IndianBankOracle', @provider=N'MSDASQL', @datasrc=N'INDIANBANK'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'INDIANBANK',@useself=N'False',@locallogin=NULL,@rmtuser=N'ags',@rmtpassword='########'

GO

EXEC master.dbo.sp_serveroption @server=N'INDIANBANK', @optname=N'collation compatible', @optvalue=N'true'
GO

EXEC master.dbo.sp_serveroption @server=N'INDIANBANK', @optname=N'data access', @optvalue=N'true'
GO

EXEC master.dbo.sp_serveroption @server=N'INDIANBANK', @optname=N'dist', @optvalue=N'false'
GO

EXEC master.dbo.sp_serveroption @server=N'INDIANBANK', @optname=N'pub', @optvalue=N'false'
GO

EXEC master.dbo.sp_serveroption @server=N'INDIANBANK', @optname=N'rpc', @optvalue=N'false'
GO

EXEC master.dbo.sp_serveroption @server=N'INDIANBANK', @optname=N'rpc out', @optvalue=N'false'
GO

EXEC master.dbo.sp_serveroption @server=N'INDIANBANK', @optname=N'sub', @optvalue=N'false'
GO

EXEC master.dbo.sp_serveroption @server=N'INDIANBANK', @optname=N'connect timeout', @optvalue=N'0'
GO

EXEC master.dbo.sp_serveroption @server=N'INDIANBANK', @optname=N'collation name', @optvalue=null
GO

EXEC master.dbo.sp_serveroption @server=N'INDIANBANK', @optname=N'lazy schema validation', @optvalue=N'false'
GO

EXEC master.dbo.sp_serveroption @server=N'INDIANBANK', @optname=N'query timeout', @optvalue=N'0'
GO

EXEC master.dbo.sp_serveroption @server=N'INDIANBANK', @optname=N'use remote collation', @optvalue=N'true'
GO

EXEC master.dbo.sp_serveroption @server=N'INDIANBANK', @optname=N'remote proc transaction promotion', @optvalue=N'true'
GO

如果您使用如下字符串“'MSDASQL','DRIVER={SQL Server};Server=INDIANBANK;UID=ags;PWD=mypass','Select*From ATM_.IR_ATMMON_ags'”,您得到的连接没有DSN,因此DSN测试是无用的

我建议你坐这个司机

与甲骨文公司的关系要好得多

这里是

其中描述了调优

这是

希望这有帮助:)

见下面我的评论

请注意,对于Microsoft驱动程序,参数如下所示
我对同一问题的解决方案是

在Oracle ODBC驱动程序设置中将数值设置参数设置为US Numeric。

引用ODBC帮助,有问题的内容加下划线)
数字设置-允许您选择在接收和返回绑定为字符串的数字数据时使用哪些数字设置来确定十进制和组分隔符。此选项允许您选择Oracle NLS设置(默认设置)、Microsoft默认区域设置(提供镜像Oracle OLE DB驱动程序行为的方法以实现更高的互操作性)、或美国数字设置(在非美国环境中使用MS Access或DAO(数据库访问对象)时需要这些设置).

您的文字有点让人困惑(至少对我来说),您想从oracle获取数据到mssql还是其他?@YvesR从oracle(远程服务器)获取数据到mssql…因此我创建了链接服务器。如果不安装oracle客户端,我永远无法从oracle获取数据。在我创建了一个配置TNSNAME的连接之后。然后我可以通过ms sql、脚本等进行访问。据我所知,系统附带的Microsoft ODBC oracle驱动程序无法正常工作,因此您尝试了我描述的另一种方法?我安装了oracle客户端。使用它我创建了我的DSN…并链接了服务器。哦,您说的是MS oracle驱动程序,我的不好。您是否可以测试从MS SQL打开“Data import wizward”,连接oracle数据库并使用相同的查询,在那里您可以检查是否获得正确的连接并检索所有数据。因此,您可以确定驱动程序等都正常,只剩下链接服务器配置。如果我修改查询,将DSN
SELECT a.*从OPENROWSET('MSDASQL','DSN=INDIANBANK;server=INDIANBANK;UID=ags;PWD=mypass','SELECT*FROM ATM_.IR_ATMMON_ags')作为
我只得到1行,但总共有5行“Oracle Provider for OLE DB 11.2.0.3.0”安装在我的系统上。我如何将其合并到我的
Select
Query?对于ODAC的安装,说明如下->()。查询类似于“从openrowset('MSDAORA.1','INDIANBANK';'ags';'mypass','Select*from ATM.IR_ATMMON_ags'))此外,您还可以阅读本文错误:
OLE DB提供程序“MSDAORA.1”尚未注册。