【问题标题】:SSIS Process XML document in Excel Workbook formatExcel 工作簿格式的 SSIS 处理 XML 文档
【发布时间】:2016-05-05 14:22:17
【问题描述】:

我正在尝试使用 SSIS 导入 XML 文档,该文档使用 Microsoft Office Excel 格式导出,包含 17 列。我有一个删除多个命名空间的 XML 任务,但现在我有一个格式类似于下面的示例代码的文档。我可以将每个单元格加载到数据库中它自己的记录中,但是由于行或单元格部分内没有标签,所以我有一个数据库表,每个单元格有一列。我没有任何行号,所以不确定是否可以进行某种预排序,或者我是否必须根据行号为 17 的倍数和 STUFF FOR XML 执行一堆 SQL通过看起来很乱的临时表对行进行路径。

<Worksheet>
  <Table>
  <Column/>
    <Row>
      <Cell StyleID="s62">
        <Data Type="String">City</Data>
      </Cell>
      <Cell StyleID="s62">
        <Data Type="String">State</Data>
      </Cell>
      <Cell StyleID="s62">
        <Data Type="String">Zip</Data>
      </Cell>
    </Row>
  </Table>
</Worksheet>

【问题讨论】:

    标签: sql-server xml ssis


    【解决方案1】:

    我不知道,如果我理解正确...

    假设您的 XML 在变量 DECLARE @xml XML 中,您可能会通过调用它们在树中的位置来获取单元格

    SELECT R.value('Cell[1]/Data[1]','varchar(max)') AS City
          ,R.value('Cell[2]/Data[1]','varchar(max)') AS State
          ,R.value('Cell[3]/Data[1]','varchar(max)') AS Zip
          --add more
    FROM @xml.nodes('/Worksheet/Table/Row') AS A(R)
    

    或者你可能会考虑这样的枢轴

    SELECT p.*
    FROM
    (
        SELECT 'Cell_' + CAST(ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS VARCHAR(10)) AS ColumnName
              ,Cell.value('Data[1]','varchar(max)') AS Data
        FROM @xml.nodes('/Worksheet/Table/Row/Cell') AS A(Cell)
    ) AS tbl
    PIVOT
    (
        MIN(Data) FOR ColumnName IN(Cell_1,Cell_2,Cell_3,Cell_4 /*add as many as you need*/)
    ) AS p;
    

    第二个可以转换为动态 SQL 来分析现有的 Cell 节点,获取它们的名称和编号,并返回适合 XML 数据的结果集...

    如果 XML 的数据在所有调用中都不相同,您将需要的最后一个...

    【讨论】:

    • 我没想过加载到数据库中的 XML 变量并尝试从那里解析,我试图在 SSIS 数据流中处理它。我会尝试批量加载它,看看它的外观。谢谢
    • 您可以直接将 xml 文件批量加载到变量中。搜索 openrowset 和 xml 和文件。有很多例子...
    • 该格式具有最大列数,因此我使用您的第一个建议和 OUTER APPLY 来获取所有值并拆分节点数据。我在访问告诉 Excel 列索引 () 的单元格属性时遇到问题,但如果我无法通过自己的方式,我会提出一个新问题。 -感谢您为我指明正确的方向。
    【解决方案2】:

    我找到的唯一解决方案是使用 interop 使用脚本任务打开文件并将其保存为 excel 格式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-18
      • 2011-02-27
      • 2014-07-07
      • 2020-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多