Ssis

SSIS 在寫入平面文件連接時即時創建新文件夾

  • August 11, 2021

我有一個 SSIS 包,旨在寫入多個文件,這些文件的儲存方式如下

\\server\MainFolder\DynamicField1\DynamicField2\File.csv 

其中子文件夾 DynamicField1 和 DynamicField2 不一定存在,而是來自我為 ConnectionString 儲存的變數。

當我從桌面執行包時,我收到以下消息:

[File [2]] Warning: The system cannot find the path specified.

錯誤繼續說:

[File [2]] Error: Cannot open the datafile "\\server\folder\abcd\efgh\filename_20190606115901.csv".

這看起來是一個不錯的文件名。

我嘗試用​​破折號替換動態文件夾,以便文件名如下所示:

\\server\folder\abcd - efgh - filename_20190606115901.csv

這實際上似乎有效。問題是,會有數百個文件,最好將它們組織在兩個級別的子文件夾中。

這是否意味著我不能即時創建文件夾?

@JonathanFite 是對的,這需要使用腳本任務。

此外,寫入 Excel 目標需要使用模板文件,然後使用文件系統任務將其直接複製到新創建的(如果需要)。我會回答,以便有一套完整的步驟,以防其他人來尋找並且具有與我相同的最低 C# 技能。我從各種來源拼湊了其中的大部分內容,但我從來沒有看到我需要的一個例子。

要寫入可能不存在的文件夾內的新 Excel 目標,需要兩個步驟。

  1. 如果該文件夾不存在,請創建該文件夾。(在 C# System.IO 的 CreateDirectory 中完美地處理了這個問題,並且不會覆蓋已經存在的目錄。)
  2. 獲取一個模板 Excel 文件,並使用文件系統任務在您想要的位置創建一個具有您想要的名稱的副本。這一步巧妙地工作。

創建文件夾:

這需要 System.IO,因此您需要將其添加到頂部的 NameSpaces。所以只需粘貼:

using System.IO;

在頂部的 NameSpaces 區域中。如果文件夾不存在,然後創建該文件夾,請將以下內容添加到該public void Main() 區域,將變數的名稱替換為您作為文件夾名稱傳入的任何變數。

           // TODO: Add your code here
           string Path = Dts.Variables["User::FolderName"].Value.ToString();
           Directory.CreateDirectory(Path);
           Dts.TaskResult = (int)ScriptResults.Success;

這段 C# 程式碼的重要部分是,如果文件夾已經存在,它不會覆蓋它,這正是我想要的行為。

創建新的 Excel 文件:

您需要首先創建一個模板文件,並創建和定義“表”。因此,只需將相同類型的數據載入到硬編碼文件位置即可。一旦你讓它載入一次,清除所有數據並將文件保存在安全的地方。然後將該文件位置添加到新變數中。這將是文件系統任務的源變數。

現在您需要做的就是添加文件系統任務。將目標設置為您希望真實文件轉到的變數,模板文件將自動複製到新位置並立即重命名。該任務應如下所示:

在此處輸入圖像描述

這實際上是一個相當簡單的過程。

您需要使用File System Task並將Operation設置為Create Directory。向它傳遞一個不帶文件名的文件路徑變數,它應該創建目錄。

有關從動態路徑創建文件夾的良好範例,請參閱此部落格文章

引用自:https://dba.stackexchange.com/questions/239985