我已經成功部署了許多SSIS包(在SQL Server 2008 R2中)。臨時表在SSIS中立即丟棄
我發現了一個困擾我的問題。檢查基本的下列流程。
在「下載文件從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,所以這是明確的修復。
爲什麼要截斷臨時表?爲什麼它也是一個全球臨時表? – gbn 2015-02-11 13:23:35
您必須在SSIS中使用全局臨時表。如果您懷疑我,請閱讀整個博客:http://www.mssqltips.com/sqlservertip/2826/how-to-create-and-use-temp-tables-in-ssis/。此外,我正在截斷臨時表,因爲我用每個文件的數據加載它。 – Anonymouse 2015-02-11 13:33:21
我會在wrk架構中使用持久表。我根本不會使用臨時表。例如:如果我正在加載Data.Foobar,我將有用於分級數據的wrk.foorbar。我不會使用## foobar ... – gbn 2015-02-11 13:55:59