2015-02-11 91 views
0

我已經成功部署了許多SSIS包(在SQL Server 2008 R2中)。臨時表在SSIS中立即丟棄

我發現了一個困擾我的問題。檢查基本的下列流程。

enter image description here

在「下載文件從FTP」我拿起新的文件,我需要進行操作,並將它們下載到本地驅動器,節省了拿起文件,這樣他們就可以在過程中的每個迭代File foreach容器。

在「創建臨時表」我創建一個臨時表這樣:

IF not exists (SELECT * FROM tempdb.dbo.sysobjects WHERE name='##tempProcessFiles' and xtype='U') 
CREATE TABLE ##tempProcessFiles 
(
--my columns 
) 
GO 

在「截斷臨時表」我這樣做:

TRUNCATE TABLE ##tempProcessFiles 

基本上,我拿起一些文件,創建一個臨時表,然後遍歷每個文件,將必要的垃圾加載到我的數據庫中。爲了確保一切順利運行,我在每次迭代時截斷臨時表,以便使用新表。在這個包的最後一步,我放下臨時表。我也放棄臨時表OnError。

問題是,當我安排這個人時,創建臨時表執行得很好,但一旦達到'截斷臨時表',它就會拋出一個異常,說臨時表不存在。具體來說:

Executing the query "TRUNCATE TABLE ##tempProcessFiles" failed with the following error: "Cannot find the object "##tempProcessFiles" because it does not exist or you do not have permissions.". Possible failure reasons: Problems with the query, "ResultSet" property not set correctly, parameters not set correctly, or connection not established correctly.

在調試模式下運行此包不會重新創建此方案。一切正常。

我發現(經過多日的挫折,追逐發送給我的觀點),通過刪除'創建臨時表'中的GO語句,我的包將正常執行。

確定我的臨時表沒有錯誤或沒有意外掉落。另外,我像永遠一樣堅持把安全信息設置爲false,延遲驗證設置爲像往常一樣真實;但我的下降臨時表任務沒有解僱 - 我甚至試圖在禁用它的情況下部署它。我的其他軟件包沒有使用這個全局臨時表,並且數據庫沒有任何計劃任務或觸發器丟棄它或任何可笑的事情。

我可以確定的是,這裏的GO運算符導致我的會話到數據庫終止,並導致我的臨時表立即被刪除。 GO運營商是如何在SSIS中工作的?如果我要在SQL Server上使用與我在包中相同的語法運行腳本,那麼我肯定不會遇到這種情況,所以它會引發我進行循環。但我不是DBA,所以它可能是這個領域工作的根本或微妙之處。

任何人都可以解釋這裏發生了什麼嗎?或者我需要提供更多關於我的軟件包的詳細信息以獲得足夠的答案?我做的唯一改變是從'創建臨時表'中刪除GO,所以這是明確的修復。

+0

爲什麼要截斷臨時表?爲什麼它也是一個全球臨時表? – gbn 2015-02-11 13:23:35

+0

您必須在SSIS中使用全局臨時表。如果您懷疑我,請閱讀整個博客:http://www.mssqltips.com/sqlservertip/2826/how-to-create-and-use-temp-tables-in-ssis/。此外,我正在截斷臨時表,因爲我用每個文件的數據加載它。 – Anonymouse 2015-02-11 13:33:21

+0

我會在wrk架構中使用持久表。我根本不會使用臨時表。例如:如果我正在加載Data.Foobar,我將有用於分級數據的wrk.foorbar。我不會使用## foobar ... – gbn 2015-02-11 13:55:59

回答

0

儘管有RetainSameConnection,但似乎連接仍在丟失。 要收集更多信息,請嘗試以下操作:

在執行包時確認上述操作(添加安全審計>登錄/註銷和會話>現有連接)。注意StartTime和EndTime,也許它會像30s(默認命令超時)那樣有趣?

然後嘗試僅使用Crate和Truncate任務運行此程序包(不使用循環)以消除其他組件干擾的可能性(使用相同Connection Manager的數據源?)。如果有效,請嘗試使用循環,但僅在內部放置截斷任務,並繼續添加其他組件。

+0

我會試試這個,這不是一個壞主意,因爲我確實想知道發生了什麼。謝謝。 – Anonymouse 2015-02-11 20:08:55