1

私はまだ SSIS に非常に慣れていないため、SQL 全般についてさらに詳しく学んでいます。UNION ALL スクリプトに一致するレコードをテーブルから取得し、サーバー上の .CSV ファイルにダンプするデータ フロー タスクを作成しました。次に、FTP タスクを追加して、ファイルを受信者にアップロードし、受信者側で処理できるようにしました。データをダンプする基準の 1 つは、テーブルの TransDate フィールドが空白で、StartDate フィールドが今日と等しいことです。4 つの StartDates と 4 つの TransDates があるため、UNION All を使用し、4 つのデータ セットのどれであるかに基づいて「行番号」を割り当てています。私が見逃しているのは、CSV にダンプされたレコードを確認し、その行に対応する TransDate を設定する方法です。

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

ヘルプ/指示をいただければ幸いです。

ありがとうございました、

ジェフ

4

2 に答える 2

1

ジェフ、これら 4 つの select ステートメントのそれぞれを別々のデータ ソースに保持する必要があるようです。つまり、4 つの OLEDB データ ソースです。これが解決の鍵のようです。

次に、各データ ソースの後で、条件付き分割を使用して、その行を出力に含めるかどうかを決定します。したがって、ソースごとに 4 つの条件分岐があります。

TransDate を設定するには、条件付き分割の直後 (基準が満たされた場合) に派生列変換も必要です。

最終的に、Union All 変換を使用してそれらを結合し、union all の出力を csv ファイルに入れます。

于 2013-03-22T03:09:30.843 に答える
0

エクスポート バッチを管理するためのより堅牢な方法:

  1. 2099-01-01 などのマーカー日付ですべての空白の変換日付を更新して、エクスポートしようとしている (4 つのテーブルすべての) レコードをマークします。これにより、エクスポートしようとしているレコードのバッチが識別され、「凍結」されます。

  2. トランスデートが 2099-01-01 のレコードのみをエクスポートして転送するようになりました

  3. エクスポートおよび FTP プロセスがエラーなしで終了したら、Transdate とマークされたレコードを今日の日付に更新します。

  4. プロセスがエラーなしで実行されなかった場合は、2099-01-01 の日付を空白に戻します。

このプロセスにより、エクスポートしようとしているレコードを分離できます。最初にそれらをマークしないと、以前のセットをまだエクスポートしている間に新しい (空白の) レコードが到着し、後で誤って「エクスポート済み」としてマークされる可能性があります。

于 2013-03-25T05:30:10.683 に答える