2009-01-29 183 views
2

如果重命名等文件系統任務失敗(例如文件不存在),則SSIS會將其視爲錯誤。這意味着整個程序包都會失敗。我可以通過使用腳本任務解決它,或者將包的最大錯誤設置爲多個。將軟件包的最大錯誤設置爲多個錯誤的問題是,如果在軟件包中的其他位置發生錯誤,那麼該軟件包應該不會失敗。在SSIS中的文件系統任務之後進行分支而不使包失敗

那麼有沒有辦法以某種方式吞下錯誤,並仍然能夠基於文件系統任務的成功或失敗進行分支?我嘗試將文件任務粘貼到ForceExecutionResult設置爲Success的順序容器中,但程序包仍然失敗,表示已達到最大錯誤計數。

回答

0

我遇到了這個確切的問題,我一直使用腳本任務。我不認爲有更好的解決方案。

+0

很高興聽到我並不孤單... – 2009-01-29 20:41:06

0

我還沒有嘗試過使用FS任務,但是它對數據流很好......如何將文件系統任務包裝到順序容器中......如果步驟失敗,容器失敗,則可以簡單地輸出從容器到成功/失敗路徑...

+0

感謝您的建議 - 我嘗試使用序列容器,但事實上在流程中出現錯誤意味着包達到其MaximumErrorCount並失敗。我想Rob是對的 - 沒有辦法做到這一點,這使得文件系統任務變得非常脆弱。 – 2009-01-30 14:04:31

2

檢查FileSystem任務的FailPackageOnFailure和FailParentOnFailure屬性,並確保它們設置爲False。另外,增加包的MaximumErrorCount屬性。

此組合將允許任務失敗,並且程序包仍能成功完成。

+0

FailPackageOnFailure和FailParentOnFailure都是錯誤的。 (正如我在我的問題中提到的)我可以增加MaximumErrorCount - 但這意味着包中其他地方的其他錯誤不會被篡改。看來選擇是:在沒有FS任務的情況下檢查鬆散。 – 2009-02-04 18:58:09

+1

如果您有其他重要的項目,可以將FailPackageOnFailure設置爲True。然後,即使增加了MaximumErrorCount,程序包也會失敗。您還可以添加錯誤處理任務,根據錯誤決定天氣是否失敗。 – 2009-02-06 05:48:34

0

您可以對連接使用約束。 右擊SSIS組件之間的連接箭頭,你可以指定,

成功/失敗和重定向。

0

prashant_sp的答案是正確的,你只需要unconditionnally繼續下一個任務,通過選擇了「成功」的工作流優先約束,但「重定向」一個將永遠繼續下去,即使你FS任務失敗(文件夾不存在,等...)

親切的問候

0

使用表達式和約束相結合的「優先約束」連接器。 總是從您之前的任務(它可能是一個查找文件的腳本)返回成功,並且如果找到文件,請設置一個變量。在「優先約束」表達式中檢查變量值並返回true或false。如果您的表達式計算結果爲false,則該程序包將不會繼續,但您不會看到任何錯誤。 - Mayukh

9

以下是一種可能的選擇。通過將文件系統任務後的Precedence Constraint更改爲Completion,可以實現問題中提到的要求。以下示例顯示瞭如何完成此操作。該示例使用SSIS 2008 R2創建,但也適用於以前的版本。

步驟一步的過程:

  1. 創建SSIS包並且如圖截圖#創建兩個變量。將一些不存在的文件路徑值分配給變量。

  2. 在包的控制流選項卡,將一個文件系統任務,腳本任務和數據流任務,如圖截圖#。腳本任務和數據流任務在這裏是假的,任務沒有被配置爲執行任何操作。

  3. 配置文件系統任務,如屏幕截圖#所示。

  4. 屏幕截圖#顯示了程序包的執行情況,正如預期的那樣,文件系統任務失敗,因爲文件路徑不存在。此外,由於錯誤,軟件包在文件系統任務之後停止執行任務。在File System TaskScript Task之間的優先約束箭頭

  5. 單擊鼠標右鍵,選擇如圖截圖# 完成。箭頭應從綠色顏色變爲藍色顏色。

  6. 屏幕截圖#顯示優先約束更改後的包執行情況。文件系統任務仍然失敗,但其他任務繼續執行。 Earlier,條件是隻有在文件系統任務成功時才執行腳本任務。 Now,條件是在文件系統任務完成其執行後執行腳本任務(不論成功或失敗)。

  7. 如果您希望根據成功/失敗將包完全分爲兩個不同的路徑。您可以這樣做,如屏幕截圖#和#。紅色箭頭表示路徑將採用文件系統任務的故障,並且綠色箭頭指示路徑將採用成功執行文件系統任務。在屏幕截圖#中顯示的程序包執行之前,我在路徑C:\temp\Source.txt中創建了一個文件。包執行後,文件被重命名,路徑不再。因此,該包失敗,如屏幕截圖#所示。

希望有所幫助。

截圖#1:

1

截圖#2:

2

截圖#3:

3

截圖#4:

4

截圖#5:

5

截圖#6:

6

截圖#7:

7

截圖#8:

8

1

使屬性 「強制執行結果」,以成功爲文件系統任務..

0

我知道這是一個老問題,但它可能有助於某人尋找答案。

與user756519的相當好的答案相結合,停止傳播錯誤可防止包失敗。這意味着您可以將故障有效地用作分支,而不用擔心它會縮小包裝。

有關更多信息,請參閱cfrag的answer on this question。該答案指向this blog entry,它解釋瞭如何爲OnError事件處理程序(使事件處理程序,打開變量視圖,顯示系統變量,將Propogate設置爲false)設置傳播變量。