尝试从链接服务器中选择的灾难性故障

时间:2013-02-08 18:40:45

标签: sql sql-server tsql sql-server-2012 linked-server

我已经从SQL SERVER 2012创建了与Pervasive SQL的链接oledb / odbc连接:

USE [master]
GO

/****** Object:  LinkedServer [KSLAP208]    Script Date: 2/8/2013 10:38:55 AM ******/
EXEC master.dbo.sp_addlinkedserver @server = N'KSLAP208', @srvproduct=N'Pervasive ODBC Interface', @provider=N'MSDASQL', @datasrc=N'C003', @location=N'localhost'
 /* For security reasons the linked server remote logins password is changed with ######## */
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'KSLAP208',@useself=N'False',@locallogin=NULL,@rmtuser=NULL,@rmtpassword=NULL

GO

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

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

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

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

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

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

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

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

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

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

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

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

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

测试连接成功。

但是,当我尝试从数据库中选择时:

select * from [KSLAP208].[C003]..PA_Profile_BASE_1119 

我只是获得了返回的字段名称,然后立即得到了这个错误:

Msg 7399, Level 16, State 1, Line 1
The OLE DB provider "MSDASQL" for linked server "KSLAP208" reported an error. The provider reported an unexpected catastrophic failure.
Msg 7330, Level 16, State 2, Line 1
Cannot fetch a row from OLE DB provider "MSDASQL" for linked server "KSLAP208".

我做错了什么?为什么我不能选择?我能够看到linnked服务器上的所有数据库和表。

如果我选择少量数据,请选择field1,field2可以正常工作。

3 个答案:

答案 0 :(得分:14)

我想我记得在创建postgresql链接服务器时这是一个问题。我认为您可能需要使用此设置重新创建链接服务器为false(或者只是在链接服务器属性 - >服务器选项中更改它):

EXEC master.dbo.sp_serveroption @server=N'KSLAP208', 
    @optname=N'remote proc transaction promotion', @optvalue=N'false'

此外,请尝试使用OPENQUERY针对链接

运行此操作
SELECT * 
FROM OPENQUERY(KSLAP208,'SELECT * FROM PA_Profile_BASE_1119');

答案 1 :(得分:2)

当我访问远程表时,我需要完整的4部分命名。试试这个:

select * from [KSLAP208].[C003].dbo.PA_Profile_BASE_1119 

我从未调查过为什么。我已经养成了包括所有部分的习惯。

您可以使用以下方式获取列列表:

select column_name
from [KSLAP208].[C003].INFORMATION_SCHEMA.COLUMNS
where table_name = 'PA_Profile_BASE_1119'

(和schema_name =如果你需要的话,无论如何)。

答案 2 :(得分:1)

无法回答原因,但您可以尝试这样做;

--link server and login
EXEC master.sys.sp_addlinkedserver N'KSLAP208',N'SQL Server';
EXEC master.sys.sp_addlinkedsrvlogin @rmtsrvname='KSLAP208', 
                  @useself='false',
                  @rmtuser='username',
                  @rmtpassword='password';

        --DO YOUR JOB HERE 
        SELECT  TOP (10) * FROM  [KSLAP208].dbName.dbo.[tableName]

--drop server link and login
EXEC sp_droplinkedsrvlogin 'KSLAP208', NULL
EXEC sp_dropserver 'KSLAP208', NULL;