2013-03-21 66 views
1

我對SSIS仍然非常陌生,並且通常在SQL中還有很長一段時間。我創建了一個數據流任務,用於從表中提取與UNION ALL腳本相匹配的記錄,並將它們轉儲到服務器上的.CSV文件。然後我添加了一個FTP任務將文件上傳到收件人進行處理。轉儲數據的標準之一是表中的TransDate字段爲空,並且StartDate字段與今天相同。因爲有4個StartDates和4個TransDates,所以我使用UNION All並根據它的4組數據中的哪一組來分配「行號」。我缺少的是驗證轉儲到CSV的記錄的方法,然後設置與該行對應的TransDate。將數據導出爲CSV後SQL中的更新記錄

SELECT 
    CallLog.CallID as Ticket 
    , 1 as Line 
    , CallLog.CustID as Store# 
    , AcctNum as SoldTo 
    , CAST(BillStart01 as DATE) as BillStart 
    , Cast(BillEnd01 as DATE) as BillEnd 
    , CostSheet01 as BillAmount 
    , SKU01 as SKU 
    , Term01 as Terms 
    , CAST(EffDate01 as DATE) as EffStart 
    , CAST(EffDate02 as DATE) as EffEnd 
FROM 
    CallLog, Detail, Subset 
WHERE 
    (CallLog.CallID=Detail.CallID and CallLog.CallID=Subset.CallID) 
AND CallType='Contract' 
    AND TransDate01 = '' 
    AND Cast(SentOps as Date) = CONVERT(date,GETDATE()) 
    AND Month(RcvDate01) <= Month(GETDATE()) 
    AND YEAR(RcvDate01) = YEAR(GetDate()) 

UNION ALL 

SELECT CallLog.CallID as Ticket 
    , 2 as Line 
    , CallLog.CustID as Store# 
    , AcctNum as SoldTo 
    , CAST(BillStart 02 as DATE) as BillStart 
    , Cast(BillEnd02 as DATE) as BillEnd 
    , CostSheet02 as BillAmount 
    , SKU02 as SKU 
    , Term02 as Terms 
    , CAST(EffDate01 as DATE) as EffStart 
    , CAST(EffDate02 as DATE) as EffEnd 
FROM 
    CallLog, Detail, Subset 
WHERE 
    (CallLog.CallID=Detail.CallID and CallLog.CallID=Subset.CallID) 
AND CallType='Contract' 
    AND TransDate02 = '' 
    AND Cast(SentOps as Date) = CONVERT(date,GETDATE()) 
    AND Month(RcvDate02) <= Month(GETDATE()) 
    AND YEAR(RcvDate02)=YEAR(GetDate()) 

UNION ALL 

SELECT 
    CallLog.CallID as Ticket 
    , 3 as Line 
    , CallLog.CustID as Store# 
    , AcctNum as SoldTo 
    , CAST(BillStart 03 as DATE) as BillStart 
    , Cast(BillEnd03 as DATE) as BillEnd 
    , CostSheet03 as BillAmount 
    , SKU03 as SKU 
    , Term03 as Terms 
    , CAST(EffDate01 as DATE) as EffStart 
    , CAST(EffDate02 as DATE) as EffEnd 
FROM 
    CallLog, Detail, Subset 
WHERE 
    (CallLog.CallID=Detail.CallID and CallLog.CallID=Subset.CallID) 
    AND CallType='Contract' 
    AND TransDate03 = '' 
    AND Cast(SentOps as Date) = CONVERT(date,GETDATE()) 
    AND Month(RcvDate03) <= Month(GETDATE()) 
    AND YEAR(RcvDate03) = YEAR(GetDate()) 

UNION ALL 

SELECT 
    CallLog.CallID as Ticket 
    , 4 as Line 
    , CallLog.CustID as Store# 
    , AcctNum as SoldTo 
    , CAST(BillStart 04 as DATE) as BillStart 
    , Cast(BillEnd04 as DATE) as BillEnd 
    , CostSheet04 as BillAmount 
    , SKU04 as SKU 
    , Term04 as Terms 
    , CAST(EffDate01 as DATE) as EffStart 
    , CAST(EffDate02 as DATE) as EffEnd 
FROM 
    CallLog, Detail, Subset 
WHERE 
    (CallLog.CallID=Detail.CallID AND CallLog.CallID=Subset.CallID) 
AND CallType='Contract' 
    AND TransDate04 = '' 
    AND Cast(SentOps as Date) = CONVERT(date,GETDATE()) 
    AND Month(RcvDate04)<=Month(GETDATE()) 
    AND YEAR(RcvDate04)=YEAR(GetDate()) 
Order BY Ticket, Line 

任何幫助/方向表示讚賞。

謝謝

傑夫

回答

1

傑夫,看起來你需要保持每個那些4個select語句在單獨的數據源 - 所以4 OLEDB數據源。這似乎是解決方案的關鍵。

然後,在每個數據源之後,使用條件拆分來確定該行是否應包含在輸出中。因此,每個來源的4個條件分割。

您還需要在條件拆分(如果已滿足條件)之後立即進行派生列轉換以設置TransDate。

最終,使用Union All轉換將它們聯合在一起,並將union的輸出全部放到您的csv文件中。

+0

Anoop,因爲我還是新手,這對我來說沒有什麼意義。使用UNION ALL的select語句正在提取我需要的記錄,我只需要返回並更新TransDate以顯示記錄被拉出。我認爲如果Ticket = 123和line = 1出現在csv中,那麼應該很容易說出,轉到SQL表中的記錄123並設置TransDate01 = today,然後處理所有爲csv提取的記錄文件。我可以在SQL中的表與UPDATE腳本之間做到這一點,我只是不知道如何在SSIS中執行任何操作。 – Elecdoc 2013-03-22 14:45:38

+0

我可以說你有兩件事要做 - 創建一個csv文件,然後更新一個用作源的表?如果是的話,那麼你能否使用SQL來識別和標記這些記錄(正如你所提到的)並且只需使用SSIS創建CSV?這會爲您節省往返時間。 – 2013-03-22 17:48:39

+0

如果我正確閱讀這篇文章,你說我應該更新TransDate字段作爲第一步,然後拉動有TransDate的記錄?不幸的是,這是一個全天運行多次的過程,大概每15分鐘一次,我不想多次拉同一個記錄,因爲這是一個計費應用程序。我現在的想法是放入臨時步驟,將記錄轉儲到SQL中的臨時表中,使用它來驗證記錄以更新TransDate,然後將內容或臨時錶轉儲到csv,然後清除臨時表。 – Elecdoc 2013-03-22 19:37:38

0

一個以管理出口批次更健壯的方式:

  1. 標記記錄(在所有四個表)你是用標記日期更新所有空白transdates出口,說2099- 01-01。這可識別並「凍結」您即將導出的一批記錄。

  2. 現在出口和轉讓只與2099年1月1日

  3. transdate記錄後出口和FTP過程正確無誤地完成,更新標記Transdate記錄是今天的日期

  4. 如果過程沒有發生錯誤,請將2099-01-01的日期重新設置爲空白。

此過程允許您隔離要導出的記錄。如果您不先標記它們,那麼新的(空白)記錄可能會在您仍在導出早期集合時到達,然後在之後將它們錯誤地標記爲「已導出」。

+0

這聽起來好像也可以。在這一點上,我已經完成了構建和測試我的項目,但我會嘗試遵循這一點,看看是否有任何性能改進。謝謝。 – Elecdoc 2013-03-25 16:05:22

+0

不會有任何性能改進,只是可靠性的提高。祝你好運。 – 2013-03-25 23:01:39