【问题标题】:SQL Server SSIS CSV flat file import > do stuff with that data > INSERT/UPDATE to SQL TableSQL Server SSIS CSV 平面文件导入 > 处理该数据 > 插入/更新到 SQL 表
【发布时间】:2014-07-28 08:39:06
【问题描述】:

我目前正在开发一个原型来创建一个包来处理一些数据。有一个 Informix 框的夜间 CSV 输出,打算对其进行冗余处理。我的计划是使用 BIDS 读取此 CSV,对数据进行处理,例如一些基本的清理和计算,然后将这些详细信息插入到 SQL Server 2008 表中。

我只是轻微接触过 SSIS,还不足以知道哪种方法可能是最好的方法。我目前有一个脚本任务,它将数据读入DataTable 对象。我已经停止了,因为担心这可能不是最好的方法。

总结一下;

导入 CSV > 做事(计算等...) > 插入新表。

哪种组件组合可以快速轻松地实现这一目标?

编辑:

数据没有任何独特之处。

20140722|0000771935|000000000000012654|0000012775|      40.000-|      289.20-|       346.800 |        346.80 |       346.800 |GBP  |0|
20140722|0000771935|000000000000012654|0000012775|      40.000-|      289.20-|       346.800 |        346.80 |       346.800 |GBP  |0|
20140722|0000771935|000000000000012654|0000012775|      40.000-|      289.20-|       346.800 |        346.80 |       346.800 |GBP  |0|

这是一些行的sn-p。某些字段的格式可能会有所不同。

000000000000012654 can become F021 or X00F5

这是指 SKU 数据和订单/托盘数量。这三行用于特定客户订单/sku/日期/订单数量/价格/折扣/货币等

如您所见,它们都是一样的。 15年的数据都是这样的,为什么没有分组是我无法理解的。我对这项业务相当陌生,这是他们给我的任务。我希望这些列是 'SELECT' 从使行唯一的视图中。这就是我必须处理的全部内容。奇怪的要求。

【问题讨论】:

    标签: .net sql-server-2008 ssis flat-file opencsv


    【解决方案1】:

    我个人不会使用 SSIS,但我更喜欢脚本解决方案而不是 UI 解决方案。

    您可以使用多种方法将 CSV 导入临时表:BCP.EXEBULK INSERTOPENROWSET(当然还有SSIS

    然后您可以在临时表上运行所需的UPDATE/INSERT 等,如果需要,将日志行写入表中。

    然后使用UPDATE/INSERT再次将数据移动到最终表

    如果你使用BULK INSERT,那么这一切都可以写在一个存储过程中

    如果您想回复更多详细信息,我会进一步扩展。

    我喜欢 staging table 方法,因为您的所有工作都可以在 staging table 中看到,而不是 SSIS,SSIS 是动态执行计算并直接推入决赛桌的。

    【讨论】:

    • 谢谢,我试试看
    【解决方案2】:

    我这样做的方法是调用一个休息网络服务来获取 CSV。这是通过 SSIS 包中的第一个脚本任务完成的。如果下载了多个文件,您可能希望更新计划表作为第一步,以及更新批处理运行信息。

    一旦 CSV 文件位于服务器上的文件夹中 - 例如C:\Downloads,将平面文件连接添加到下载的 CSV 文件。然后创建一个数据流任务,其中有一个带有 oledb 源的平面文件源(用于保存数据的数据库表)。

    那么你想要的是在每个来源下面进行排序。然后在 ID 上使用左外连接进行合并连接 - 您可以在此下方创建一个条件拆分,根据 ID 是否为空(由于外连接,它将为空),该拆分是新的还是现有的。然后在条件拆分下,您将为现有(ID 不为空)执行 oledb 更新命令,并为插入(ID 为空 - 新记录)执行 oledb 目标。

    这是我通过 SQL Server 代理完成的一个结构:

    flat file source (csv file)                       oledbsource (db table)
               |                                                 |
               |                                                 |
    sort (by ID)                                      sort (by ID)
           |                                                 |
           |--------------------------------------------------
                                   |
                               merge join (left outer)
                                   |
                                   |
                               conditional split (ID null = new, not null = existing)
                                   |
                       [**your calculations here]
                                   |
           existing-----------------------------------------new
           |                                                  |
    oledb command (update table command)               oledb destination (insert)   
    

    问候,罗伯

    【讨论】:

    • 好建议。请原谅我在这里不够清晰,但是 - 这些数据并不总是有 ID。它是基于视图的数据,需要放入自己的表中。所以考虑到这一点......
    • 是否有任何候选键组合可以用于合并连接?例如可以提供唯一值的字段组合?如果没有,也许您可​​以先将此数据提取到 A 暂存表中,然后在您的操作/报告表中有数据后在暂存表上调用截断 SQLCommand 以清除数据。然后,如果需要,您可以添加一些数据流任务来进行数据清理和数据转换。
    • 恐怕不行。这就是我在数据中寻找的。查看我的编辑
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多