2017-03-03 49 views
0

這個問題是一個後續問題到這一個:如何在SSIS包中按月遞增?

Can I set variables in an SSIS for loop based on a query?

它的要點是,我有用於填充具有兩個值的查詢的foreach循環容器,如下所示:

WHERE SomeDate BETWEEN '1-Jan-2016' AND '31-Dec-2016' 
     AND Param1 = ? AND Param2 = ?; 

但是,我決定不做全年拉,並決定做一個月拉,所以我改變了從這個查詢:

WHERE SomeDate BETWEEN '1-Jan-2016' AND '31-Jan-2016' 
     AND Param1 = ? AND Param2 = ?; 

但是,我寧願不寫12個單獨的,我覺得我可以在一個foreach循環容器中做到這一點。問題是我不知道如何按月遞增SomeDateSomeDate類型爲datetime

我知道,我將不得不窩在第一foreach循環容器月foreach循環容器,但如何將其設置這樣Param1Param2會知道他們的價值是從第一虧損是正義foreach循環容器。

+0

你爲什麼不整整一年?無論如何,SSIS將在數據流中使用批量大小。全年運行查詢需要多長時間?我沒有看到任何性能改進通過逐個做12個查詢。 – asemprini87

+0

當一年的結果CSV超過100 GB時,我認爲每月將是一個更好的主意。 – Leon

+0

但是,您仍然可以從數據庫獲取全年數據並將其分成12個不同的CSV – asemprini87

回答

1

按照意見,如果你的目標是創建每月1個csv文件,我不認爲你需要修改查詢。我認爲你需要的是在數據流中使用條件分割。

所以,你會首先用您的年度查詢數據源任務,然後裏面添加一個條件分割:

enter image description here

然後您可以按月份增加目標文件:

enter image description here

就像一個評論,我不會使用「CSV」本身。我將使用「PSV」,其中P代表Pipe Delimited「|」。在任何ETL過程中,他們通常不會遇到麻煩。

此方法的更大優勢是您不會迭代數據,並應使其性能更高。

+0

回到此處,我很感謝答案。但是,我試圖避免在SSIS中創建12個單獨的項目。有沒有辦法避免這種情況,或者是上面描述的唯一「真正方法」的方法嗎? – Leon

+0

不,您可以使用循環逐個創建文件,但性能較差。 – asemprini87

+0

有趣的方法,我不能說我見過這樣的事情。我已經最好地接受了你的答案,感謝你的想法和幫助。 – Leon

0

首先,如果你在SQL中使用循環,你做錯了什麼。鑑於這種情況,你可以在一個循環中使用日期部分用於選擇一個月,像這樣:

WHERE datepart(mm, SomeDate) = 1 
and year(SomeDate) = 2016 
AND Param1 = ? 
AND Param2 = ?;