SSIS - 循环遍历列

时间:2016-08-02 23:30:14

标签: sql excel csv ssis

一段时间以来,我们一直在使用Excel文件来存储我们的购买数据。此电子表格文件具有统一的结构。由于它有很多属性,我只想说出最重要的属性。

在此Excel文件中,我们有产品ID的列,每种产品的尺寸以及产品ID和尺寸的每种合成的数量。

问题是,我们有几家商店,每家商店都收到不同数量的商品。因此,在每个excel中,我们为每个商店都有一个列,我们在其中放置从每个商店中订购的数量。

enter image description here

所以,我想要做的是遍历每个商店的列,将每个商店的相应数量添加到特定商店。

例如,

INSERT INTO MyTable (product_ID, size_ID, store_ID, quantity)
    VALUES (12345, 34, Mirkwood, 1)

然后,重复每列。

我一直在努力为此寻找解决方案,但尚未弄明白。我非常感谢所有的帮助或提示。

2 个答案:

答案 0 :(得分:1)

避免尝试在SSIS中创建一些复杂的,动态的循环代码。

分割流程会更加简单,因此您拥有product_idsize_id和一个商店的数据。使用您已知的store_id为每个商店执行插入。

虽然循环解决方案听起来不错,但可能意味着您在添加新商店时不必更新代码,但在SSIS中实施起来会很复杂,我猜你不是经常添加商店以使努力变得有价值。

答案 1 :(得分:0)

您可以使用unpivot组件

选中的列将是您需要转换为行的列。目标列是您将数据放入的列。透视键值列名:透视列的名称。

enter image description here

enter image description here

之后,您可以正常插入行。

另一种方法是使用sql,我在这里使用t-sql,但其他数据库应该有类似的东西。首先将原始数据导入表中。然后使用unpivot做类似的事情。

    CREATE TABLE #pvt (VendorID int, Emp1 int, Emp2 int,
        Emp3 int, Emp4 int, Emp5 int);
    GO
    INSERT INTO #pvt VALUES (1,4,3,5,4,4);
    INSERT INTO #pvt VALUES (2,4,1,5,5,5);
    INSERT INTO #pvt VALUES (3,4,3,5,4,4);
    INSERT INTO #pvt VALUES (4,4,2,5,5,4);
    INSERT INTO #pvt VALUES (5,5,1,5,5,5);
    GO

    select * from #pvt

    --Unpivot the table.
    SELECT VendorID, Employee, Orders – destination table, first column is row group?
    FROM 
       (SELECT VendorID, Emp1, Emp2, Emp3, Emp4, Emp5
       FROM #pvt) p – detail source
    UNPIVOT
       (Orders FOR Employee IN –orders: data, For: column group
          (Emp1, Emp2, Emp3, Emp4, Emp5)
    )AS unpvt;

此方法的唯一问题是,如果添加了更多列(存储),则无法处理。但你可以让它变得动态: https://www.mssqltips.com/sqlservertip/3002/use-sql-servers-unpivot-operator-to-dynamically-normalize-output/