2017-07-11 23 views
0

我已經建立了一個sql任務,將完整的名稱結果集加載到一個對象變量中,我將它連接到一個foreach循環,逐行掃描整個對象。我不確定接下來的步驟。如果我可以創建一個數據流任務,並以某種方式設置目標變量等於每個循環映射變量,這將是很好的。有小費嗎?如何動態創建excel文件與ssis

+0

你的結果對象是什麼? – LONG

+0

我的結果對象只是一個列和80個不同名稱的表格 – jdd

+0

我的不好,我的意思是這些名稱用於什麼?是用於填充的數據還是用於動態過程的表或數據庫名稱? – LONG

回答

0

根據你所描述的,所有你需要做的是如下:

1:execute SQL task返回Excel文件名,您已經有了一個名單。

  1. 將輸出連接到Foreach Loop Container並開始迭代每個名稱。

  2. 在容器內部,您需要的第一項任務是Script Task,它用於創建每個excel文件。

  3. 我認爲excel格式對於您需要填充的所有內容都是相同的。您需要創建一個具有指定的所需列標題名稱的新模板。

  4. 對於script task,從容器取映射變量作爲read only變量,你需要創建另一個變量,將其設置爲read and write,假設它被命名爲A;用於存儲每個動態excel文件路徑,並編輯腳本。

  5. 如果您熟悉C#,那麼您將很容易爲每個迭代名稱使用Copy模板。

代碼將是這樣的:

Using System.IO; 
... 
... 
... 
string source = "C:\\template.xlsx";//need to be a full path 
string target = "C:\\" + Dts.Variables["that read only variable"].Value.Tostring() + ".xlsx" 
File.Copy(source,target); 
Dts.Variables["A"].Value = target; //important! 
  • Script task後,需要一個有限的數據流的任務,內部的,則需要一個excel destination,棘手的部分是(1):你需要設置一個動態的ExcelFile path屬性爲excel connection manager,我建議第一次使用現有的excel來緩存映射,然後對於動態連接部分,選擇A,這是read and write變量從script task

  • 用於填充數據到Excel,你需要所有的varchar類型轉換爲nvarchar,這可以用做到無論derived columndata conversion

  • 最後但並非最不重要的,同時爲connection manager設置delay validationTRUEexcel destination和整個data flow task,這對於動態過程是非常重要的。

  • 以上所有可能是一個簡單的解釋,但這是主要思想。 (1)如果您沒有安裝數據訪問引擎,則Excel在SSIS中非常挑剔,可能無法成功填充數據。對於Excel可能需要.JET(舊)或.ACE(新)提供者。(2)如果您的標題行不是簡單的第一行,您可能還需要考慮OPENROWSET屬性。

    +0

    讓我知道哪一步讓您困惑 – LONG

    +0

    我對C#不熟悉。還有什麼是「緩存映射」? – jdd

    +0

    什麼是腳本任務等效的SQL任務? – jdd