2015-10-15 29 views
0

我有一個SSIS包,需要在每週的第一天運行,源代碼來自excel文件,目標是SQL表。SSIS避免手動更改派生列表達式

當前進程是手動將excel文件的空值替換爲0(花費大量時間),所以我創建了一個包,並且正在使用派生列表達式「(Column1 ==」「? 0:Column1)「,但excel文件列並不總是與派生列表達式相同,所以每次我必須運行包時,我也必須編輯派生列表達式。我正在尋找更好的方法來做到這一點,並避免手動進行。提前致謝。

+0

如果我理解正確,一週派生列可能基於Column1,下一週可能是Column2,Column3或另一列?如果是這樣的話,你如何知道從一週到下一週應用哪一列?相對於源Excel工作表中的其他人而言,此列的獨特之處是什麼? – user3662215

+0

我編輯了我的評論。 excel列包含上週的日期,所以Column1是星期一(20151005),第2列(20151006)等的日期...然後在目的地表中,列是週一,週二,直到週五 –

+0

對不起,我沒有看到任何其他信息。另外,您是否必須每週手動打開派生列任務以更改列源? – user3662215

回答

1

有沒有簡單的內置方式來處理SSIS中的動態列名稱,更不用說擔心派生列轉換中的表達式。

使用BiML動態創建將根據當前列名導入文件的SSIS包。

Google BiML Tutorial開始學習BiML,祝你好運。

1

如果無法讓每週創建Excel文件的人讓他們命名「星期一」,「星期二」,「星期三」,「星期四」和「星期五」五個列,而不是「20151005」,「20151006」,「20151007」,「20151008」和「20151009」(例如上週申請的那個),則可以通過以下步驟完成。

步驟:

  1. 在SSIS包中創建一個字符串類型的新的全球用戶變量並調用它像「天」。
  2. 在您的派生列表達式中,用新的用戶變量替換「20151005」。你可以從上面拖拽它,它會看起來像@ [user :: Day]。
  3. 現在要動態地填充新的變量「Day」,添加一個SQL腳本,該腳本運行以下SQL,並使用單行的ResultSet。在左側的結果集中,在變量名稱列下添加用戶變量「日」。給結果名稱的值爲「0」。在常規下,將源類型設置爲直接輸入,並提供以下SQL,它將以yyyymmdd格式返回前一週星期一的日期值。

    declare @date as datetime 
    set @date = dateadd(week, datediff(week, 0, getdate()-7), 0) 
    select cast(year(@date) as char(4)) + right('00' + convert(varchar(2), month(@date)), 2) + right('00' + convert(varchar(2), day(@date)), 2) 
    

這裏的關鍵是,你可以運行SSIS包下一週的任何一天,它將捕獲此信息爲前一週的星期一。但是如果你跳過一個星期,它將會尋找一個不再存在的列。使用SQL腳本捕獲星期一的前一週的日期的替代方法是直接從工作表中讀取第一列,這變得很複雜,因爲它涉及使用Visual Basic或C#的腳本任務,而不是......需要Excel參考。涉及更多,但可以完成。

希望這會有所幫助。

+0

哪裏應該放置SQL腳本? –

+0

填充變量的SQL腳本只需放置在派生列中應用相同變量的步驟之前的任何位置。 – user3662215