2013-05-15 4 views
6

EXEC을 사용하여 수동으로 실행할 때마다 올바르게 실행되는 SQL Server 저장 프로 시저가 있지만 SSIS 패키지의 일부로 실행될 때 이와 같은 오류가 실패SSIS에서 실행할 때 저장 프로 시저가 SSIS에서 실행할 때 스키마 버전 변경 오류를 반환하지만 직접 실행할 때

Executing the query "EXECUTE (ProcName) " failed with the following error: 
"The OLE DB provider "SQLNCLI10" for linked server "(OtherServer)" reported a 
change in schema version between compile time ("177833127975044") and 
run time ("177841717910098") for table (Server.Database.Schema.Table)". 

절차는 SP와 같은 서버에서 다른 데이터베이스에 테이블로 도면 데이터를 병합 MERGE 문이다.

뷰는 연결된 서버 OtherServer을 참조합니다. 연결된 서버에서 참조되는 데이터베이스는 야간에 삭제되고 다시 작성됩니다.

지금까지, 나는이 일을 시도했다 :

1) 떨어 뜨리 및 병합을 실행하기 전에 뷰를 재 작성.

2) MERGE WITH RECOMPILE이 포함 된 SP 정의.

3) MERGE 문을 EXEC()에 넣어서 미리 컴파일하지 않도록하십시오.

4) SSIS의 관련 단계에서 Bypass Prepare을 true로 설정하십시오.

편집 : 저장 프로 시저와 서버는 SQL Server 2008을 실행

연결된 서버 2008 R2입니다.

+0

무거운 편이지만 재 작성 될 때마다 다시 작성된 데이터베이스의 데이터 (SSIS를 사용하지 않음)를 정적 데이터베이스로 전송할 수 있으며 뷰의 정적 데이터베이스를 참조 할 수 있습니다. SSIS가 삭제되고 다시 만들어지는 데이터베이스로 멋지게 플레이 할 수있는 방법이 있는지 확신하지 못합니다. 매번 SSIS 패키지를 다시 만들지 않는 한. –

+0

어떤 SSIS 버전을 사용하고 있습니까? –

+0

[여기] (http://social.msdn.microsoft.com/forums/en-US/sqldataaccess/thread/0223b695-f698-41a6-8ddc-deabd6306aae/)와 관련된 몇 가지 관련 토론이 있습니다. – criticalfix

답변

10

그래서 문제는 OLEDB의 메타 데이터 카탈로그와 잘 일치하지 않는 링크 된 서버의 개체와 동의어를 사용하고 있다는 것입니다 (오류 메시지에 표시되는 번호가 생성됩니다). :

1) 연결된 서버에

DBCC FREEPROCCACHE 

를 호출합니다. 데이터베이스가 매일 삭제되므로 캐시를 지우는 것이 데이터베이스의 다른 사용자에게 큰 부담이되지 않을 수도 있습니다.

2) 저장 프로 시저에서 전체 표기법 (ServerName.DatabaseName.SchemaName.ObjectName)을 4 개 사용하십시오.

+0

저는 이미 2 번을하고 있습니다. 나는 오류를 위생적으로 여기에 게시 할 때이를 지나치게 단순화했습니다. 지금 # 1 시도 중. –

+0

# 1이 그 일을 한 것처럼 보입니다. SP를 호스팅하는 서버에서 실행해야했지만 이후에는 성공적으로 실행되었습니다. 그래도 범위를 하나의 데이터베이스로 제한하는 방법이 있습니까? 이 모든 것이 실행될 때마다 모든 데이터베이스에 대해 프로 시저 캐시를 플러시하지 않으려 고합니다. –

+3

DBCC FLUSHPROCINDB (db_id (@DatabseName)); –