1

我对 SSIS 还是很陌生,而且总体上在 SQL 方面走得更远。我创建了一个数据流任务,它从表中提取与 UNION ALL 脚本匹配的记录并将它们转储到服务器上的 .CSV 文件中。然后,我添加了一个 FTP 任务,将文件上传到收件人,以便他们最终处理。转储数据的条件之一是表中的 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 个选择语句中的每一个都保存在单独的数据源中 - 所以 4 个 OLEDB 数据源。这似乎是您解决方案的关键。

然后在每个数据源之后,使用条件拆分来确定该行是否应包含在输出中。因此,每个来源都有 4 个条件拆分。

您还需要在条件拆分后立即进行派生列转换(如果已满足条件)来设置 TransDate。

最终,使用 Union All 转换将它们合并在一起,并将 union all 的输出放到您的 csv 文件中。

于 2013-03-22T03:09:30.843 回答
0

管理导出批次的更强大的方法:

  1. 通过使用标记日期更新所有空白转换日期来标记您将要导出的记录(在所有四个表中)例如 2099-01-01。这会识别并“冻结”您将要导出的那批记录。

  2. 现在仅导出和传输日期为 2099-01-01 的记录

  3. 导出和 FTP 过程无误完成后,将标记为 Transdate 的记录更新为今天的日期

  4. 如果该过程没有发生错误,请将 2099-01-01 日期设置回空白。

此过程允许您隔离要导出的记录。如果您不先标记它们,那么新的(空白)记录可能会在您仍在导出较早的集合时到达,然后它们会被错误地标记为“已导出”。

于 2013-03-25T05:30:10.683 回答