- 원인 : MSSQL 2005 64bit에서 32bit의 SQL2000이나 SQL7.0으로 링크드 서버 연결할 때
- 서버환경
원격지 : Microsoft SQL Server 2005 Standard Edition (64-bit)
대상 : Microsoft SQL Server 2000 Standard Edition (32-bit)
- 에러메시지
---------------------------------------------------------------------------------------------------
연결된 서버 "ㅌㅌGameLog1"의 OLE DB 공급자 "SQLNCLI"이(가) 메시지 "지정되지 않은 오류입니다."을(를) 반환했습니다.
연결된 서버 "ㅌㅌGameLog1"의 OLE DB 공급자 "SQLNCLI"이(가) 메시지 "이 작업을 완료하는 데 필요한 저장 프로시저가 서버에 없습니다. 시스템 관리자에게 문의하십시오."을(를) 반환했습니다.
메시지 7311, 수준 16, 상태 2, 줄 1
연결된 서버 "ㅌㅌGameLog1"에 대한 OLE DB 공급자 "SQLNCLI"의 스키마 행 집합 "DBSCHEMA_TABLES_INFO"을(를) 가져올 수 없습니다. 공급자가 인터페이스를 지원하지만 이 인터페이스를 사용하면 오류 코드가 반환됩니다.
----------------------------------------------------------------------------------------------------------------------
- 참고문헌
http://support.microsoft.com/kb/906954/ko
1. 위와같이 2005 64비트에서 2000 32비트로 링크드서버를 통해서 데이터를 끌어올 때 에러를 발생을 합니다.
2. 32비트 머신에서 '실행'에 cmd를 입력해서 윈도우커맨드창을 엽니다.
윈도우 커맨드창에 아래와 같이 입력합니다.
------------------------------------------------------------------------------------------------
osql -E -S "localhost" -i "C:\Program Files\Microsoft SQL Server\MSSQL\Install\instcat.sql"
------------------------------------------------------------------------------------------------
원본
osql -E -S <LinkedServerName> -i <Location>\instcat.sql
------------------------------------------------------------------------------------------------
3. 그러면 엄청난 숫자가 마구마구 나오고 마지막에
instcat.sql completed successfully.
가 입력이 되면서 끝이 납니다.
4. 그럼 아까 실행했던 원격문을 다시 실행하면 정상적으로 가져올 수 있는것을 확인할 수 있습니다.
이런 방법도 있었는데 좀 위험할거 같아서
아래 방법으로 하였다.
영문]
OLE DB provider "SQLNCLI" for linked server "SQLServer2000" returned message "Unspecified error".
OLE DB provider "SQLNCLI" for linked server "MySQLServer7" returned message "The stored procedure required to complete this operation could not be found on the server. Please contact your system administrator.".
Msg 7311, Level 16, State 2, Line 9
Cannot obtain the schema rowset "DBSCHEMA_TABLES_INFO" for OLE DB provider "SQLNCLI" for linked server "OSLO". The provider supports the interface, but returns a failure code when it is used.
[한글]
연결된 서버 "xxx.xxx.xxx.xxx"의 OLE DB 공급자 "SQLNCLI10"이(가) 메시지 "지정되지 않은 오류입니다."을(를) 반환했습니다.
연결된 서버 "xxx.xxx.xxx.xxx"의 OLE DB 공급자 "SQLNCLI10"이(가) 메시지 "이 작업을 완료하는 데 필요한 저장 프로시저가 서버에 없습니다. 시스템 관리자에게 문의하십시오."을(를) 반환했습니다.
메시지 7311, 수준 16, 상태 2, 줄 1
연결된 서버 "xxx.xxx.xxx.xxx"에 대한 OLE DB 공급자 "SQLNCLI10"의 스키마 행 집합 "DBSCHEMA_TABLES_INFO"을(를) 가져올 수 없습니다. 공급자가 인터페이스를 지원하지만 이 인터페이스를 사용하면 오류 코드가 반환됩니다.
해결방법
먼저 Microsoft의 기술 문서를 찾아 보았습니다. 아래 주제로 문서가 있었습니다.
l 64비트 SQL Server 2005 클라이언트에서 연결된 32비트 SQL Server 2000 서버 또는 연결된 SQL Server 7.0 서버로 분산 쿼리를 실행하려고 하면 오류 메시지가 나타날 수 있다(http://support.microsoft.com/kb/906954/ko)
기술 문서의 내용을 읽어보면 instcat.sql을 다시 실행하라는 내용입니다. 아무래도 겁나는 일이죠. 그래서 더 알아보니 위에서 나온 오류는 특정 저장 프로시저(Stored Procedure)가 없어서 발생하는 것이었습니다. 결국 저장 프로시저 하나만 추가해 주면 해결되는 문제였습니다. 다음 저장 프로시저를 32비트 버전의 SQL Server 2000(7.0) master 데이터베이스에 추가하면 됩니다.
create procedure sp_tables_info_rowset_64
@table_name sysname,
@table_schema sysname = null,
@table_type nvarchar(255) = null
as
declare @Result int set @Result = 0
exec @Result = sp_tables_info_rowset @table_name, @table_schema,@table_type
SSISO Community