2013-05-15 10 views
6

Ich habe eine gespeicherte SQL Server-Prozedur, die jedes Mal korrekt ausgeführt wird, wenn sie manuell mit EXEC ausgeführt wird, aber wenn sie als Teil eines SSIS-Pakets ausgeführt wird einen Fehler irgendwie wie folgt aus:Stored Procedure gibt Schemaversionsänderungsfehler bei Ausführung von SSIS zurück, aber nicht bei direkter Ausführung

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)". 

Das Verfahren ist eine MERGE Anweisung, die Daten aus einer Ansicht in eine Tabelle in einer anderen Datenbank auf demselben Server wie der SP übergeht.

Die Ansicht bezieht sich auf den verbundenen Server OtherServer. Die Datenbank, auf die auf dem Verbindungsserver verwiesen wird, wird gelöscht und jede Nacht neu erstellt.

Bisher habe ich diese Dinge versucht:

1) Dropping und neu zu erstellen, die Ansicht vor der MERGE ausgeführt wird.

2) Definieren des SP, der die MERGE WITH RECOMPILE enthält.

3) Verpackung der MERGE-Anweisung in EXEC(), so dass es nicht im Voraus kompiliert werden würde.

4) Einstellung von Bypass Prepare im SSIS auf den relevanten Schritt auf true setzen.

bearbeiten:

Der Server mit der gespeicherten Prozedur ist SQL Server 2008 ausgeführt Der Verbindungsserver ist 2008 R2.

+0

Ein bisschen schwerfällig, aber können Sie Daten (nicht mit SSIS) aus der neu erstellten Datenbank in eine statische Datenbank jedes Mal neu erstellen, wenn es neu erstellt wird, und beziehen Sie sich auf die statische Datenbank in der Ansicht. Ich bin mir nicht sicher, ob es eine Möglichkeit gibt, SSIS dazu zu bringen, mit einer Datenbank, die gelöscht und neu erstellt wird, nett zu spielen. Es sei denn, Sie erstellen Ihr SSIS-Paket auch jedes Mal neu. –

+0

Welche Version von SSIS verwenden Sie? –

+0

Es gibt einige verwandte Diskussion [hier] (http://social.msdn.microsoft.com/forums/en-US/sqldataaccess/thread/0223b695-f698-41a6-8ddc-deabd6306aae/). – criticalfix

Antwort

10

Das Problem besteht darin, dass Sie ein Synonym für die Objekte des Verbindungsservers verwenden, das nicht gut mit OLEDBs Metadatenkatalog funktioniert (das erzeugt die Zahlen, die Sie in der Fehlermeldung sehen.) Es gibt zwei Lösungen Rufen

1)

DBCC FREEPROCCACHE 

auf dem Verbindungsserver. Da die Datenbank ohnehin jeden Tag gelöscht wird, ist das Löschen des Caches für andere Benutzer der Datenbank möglicherweise nicht so belastend.

2) Verwenden Sie die vollständige 4-teilige Notation (ServerName.DatabaseName.SchemaName.ObjectName) in Ihrer gespeicherten Prozedur.

+0

Ich mache bereits # 2. Ich habe es zu sehr vereinfacht, als ich den Fehler bereinigt habe, um ihn hier zu posten. Probieren Sie # 1 jetzt. –

+0

Es sieht so aus, als ob # 1 den Job gemacht hat. Ich musste es auf dem Server ausführen, der den SP hostet, aber danach wurde es erfolgreich ausgeführt. Gibt es eine Möglichkeit, den Umfang auf eine Datenbank zu beschränken? Ich möchte wirklich nicht den Prozedur-Cache für alle meine Datenbanken jedesmal leeren, wenn dieser läuft. –

+3

DBCC FLUSHPROCINDB (db_id (@DatabaseName)); –