2013-05-15 25 views
6

我有EXEC手動運行時正確地執行每一次SQL Server存儲過程返回架構版本更改錯誤,但是當它運行作爲一個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)". 

的過程是一個MERGE聲明,從視圖中合併數據到一個表中的相同的服務器上SP的另一個數據庫。

該視圖指的是鏈接的服務器OtherServer。鏈接服務器上引用的數據庫每晚都會被刪除並重新創建。

到目前爲止,我已經嘗試了這些東西:

1)刪除並重新創建運行在合併之前的觀點。

2)定義包含MERGE WITH RECOMPILE的SP。

3)包裝,在EXEC() MERGE語句所以它不會提前編譯。

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)。

+0

我已經在做#2。當我在這裏發佈錯誤消息時,我過度簡化了它。立即嘗試#1。 –

+0

看起來#1做了這項工作。我必須在承載SP的服務器上運行它,但在此之後它會成功運行。有沒有辦法將範圍限制在一個數據庫中?我真的不想在每次運行時刷新我所有數據庫的過程緩存。 –

+3

DBCC FLUSHPROCINDB(db_id(@DatabseName)); –