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

时间:2013-01-28 08:07:20

标签: 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 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名称:INDIANBANK

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

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

当我执行以下查询时Select * From openquery(IndianBank,'Select * From ATM_PROGNOSIS.IR_ATMMON_AGS') 它只检索一行

我的链接服务器代码: -

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

2 个答案:

答案 0 :(得分:5)

如果你使用了这样的字符串“'MSDASQL','DRIVER = {SQL Server}; SERVER = INDIANBANK; UID = ags; PWD = mypass','选择*来自ATM_PROGNOSIS.IR_ATMMON_AGS'”你得到了DSN-less连接所以DSN的测试是没用的。

我建议你带这个司机
Oracle Data Provider for .NET
它与Oracle更友好。

这是
the example for ODP.NET
在哪里描述调整。

这是 the full docs for ODP.NET

希望这会有所帮助:)

请参阅下面的评论。

P.S。对于Microsoft驱动程序,此处显示参数 Microsoft OLE DB Provider for ODBC

答案 1 :(得分:0)

我对同样问题的解决方案是

在Oracle ODBC驱动程序设置中将“数字设置”参数设置为“美国数字”。

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