【问题标题】:How to insert column name in the destination table in ssis?如何在 ssis 的目标表中插入列名?
【发布时间】:2013-08-13 01:30:46
【问题描述】:

!参考问题1

如图所示...我有一个 excel 表,其中一个接一个地包含 32 个表(我在图像中取了 2 个表)可能会增加表数...但是元数据对于所有人都是相同的tables.Table 有两列,一列是常量(名称),另一列会发生变化(TPA,TPB.. 等),但列位置没有变化。 现在的问题是如何保存表头并作为 T_type 值插入到目标表中?

每个表的行数不固定(所以我们不能去单元格引用)。

【问题讨论】:

    标签: excel header ssis columnname


    【解决方案1】:

    我理解的问题

    我相信您在 Excel 中的数据看起来差不多

    Name | TPA
    abc  | x
    ...
    
    Name | TPB
    acz  | p
    

    数据可以描述为数据块。一个块由一个起始行定义,其中包含Name 的值。该行的下一个单元格将包含一个适用于所有后续行的值。

    在标题行之后,您需要提取键值对并将它们加上表名写入您的目的地。

    元数据保持一致,只是源数据全部被banjaxed。

    分辨率

    这正是我写SSIS Excel Source via SSIS 时必须克服的问题。我们必须从报告中获取我们的数据源,而不是从干净的表格数据中获取。使用这种方法,您只需定义等效的 ParseSample 方法,然后在 foreach 循环(ExcelParser 的第 71 行)中放入块的逻辑中的所有内容都来自值为“名称”的字段,直到您遇到空行。

    伪码近似

    # enumerate through all my source data
    foreach row in source data
        # assign values to local variables
        col0 = row[0]
        col1 = row[1] 
    
        # Test for end of block
        if col0 == "Name"
            tableName = col1
        else if col0 == string.Empty
            # do nothing
        else
            newRow = dataTable.NewRow()
            newRow[0] = col0
            newRow[1] = tableName
            newRow[2] = col1
            dataTable.Add(newRow)
    

    如果你想简化事情,你可以在ScriptMain中拥有所有的解析逻辑,并省去所有数据表的废话。

    优点是代码会更少,缺点是调试脚本是 SSIS 2012 之前的恶魔。它在 2012 年仍然很笨拙,但总比之前的一无所有要好。

    【讨论】:

    • 不使用脚本组件可以实现吗?
    • 您可以使用 Excel 源,它会将所有入站数据视为 unicode,这很好。不使用脚本组件的挑战是您拥有数据窗口。窗口的第一行具有目标表名称,后续行需要使用该名称。 SSIS 中并没有真正的 OOB 机制来允许您将前一行的值应用于当前行。另一种方法仍然需要一个脚本组件,除了作为源之外,它会生成代理键以允许对后续行进行分组。将所有这些写入临时表,然后使用 SQL
    猜你喜欢
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    • 2020-12-05
    相关资源
    最近更新 更多