【问题标题】:Convert Xml to Table SQL Server将 XML 转换为表 SQL Server
【发布时间】:2011-04-28 17:05:22
【问题描述】:

我想知道如何读取 xml 数据并将其转换为 TSQL 中的表?

例如:

<row>
    <IdInvernadero>8</IdInvernadero>
    <IdProducto>3</IdProducto>
    <IdCaracteristica1>8</IdCaracteristica1>
    <IdCaracteristica2>8</IdCaracteristica2>
    <Cantidad>25</Cantidad>
    <Folio>4568457</Folio>
</row>
<row>
    <IdInvernadero>3</IdInvernadero>
    <IdProducto>3</IdProducto>
    <IdCaracteristica1>1</IdCaracteristica1>
    <IdCaracteristica2>2</IdCaracteristica2>
    <Cantidad>72</Cantidad>
    <Folio>4568457</Folio>
</row>      

8   3   8   8   25  4568457
3   3   1   2   72  4568457

【问题讨论】:

    标签: sql xml sql-server-2008 tsql sql-server-2005


    【解决方案1】:

    这是答案,希望对某人有所帮助:)

    首先,xml 的编写方式有两种变化:

    1

    <row>
        <IdInvernadero>8</IdInvernadero>
        <IdProducto>3</IdProducto>
        <IdCaracteristica1>8</IdCaracteristica1>
        <IdCaracteristica2>8</IdCaracteristica2>
        <Cantidad>25</Cantidad>
        <Folio>4568457</Folio>
    </row>
    <row>
        <IdInvernadero>3</IdInvernadero>
        <IdProducto>3</IdProducto>
        <IdCaracteristica1>1</IdCaracteristica1>
        <IdCaracteristica2>2</IdCaracteristica2>
        <Cantidad>72</Cantidad>
        <Folio>4568457</Folio>
    </row>
    

    答案:

    SELECT  
           Tbl.Col.value('IdInvernadero[1]', 'smallint'),  
           Tbl.Col.value('IdProducto[1]', 'smallint'),  
           Tbl.Col.value('IdCaracteristica1[1]', 'smallint'),
           Tbl.Col.value('IdCaracteristica2[1]', 'smallint'),
           Tbl.Col.value('Cantidad[1]', 'int'),
           Tbl.Col.value('Folio[1]', 'varchar(7)')
    FROM   @xml.nodes('//row') Tbl(Col)  
    

    2.

    <row IdInvernadero="8" IdProducto="3" IdCaracteristica1="8" IdCaracteristica2="8" Cantidad ="25" Folio="4568457" />                         
    <row IdInvernadero="3" IdProducto="3" IdCaracteristica1="1" IdCaracteristica2="2" Cantidad ="72" Folio="4568457" />
    

    答案:

    SELECT  
           Tbl.Col.value('@IdInvernadero', 'smallint'),  
           Tbl.Col.value('@IdProducto', 'smallint'),  
           Tbl.Col.value('@IdCaracteristica1', 'smallint'),
           Tbl.Col.value('@IdCaracteristica2', 'smallint'),
           Tbl.Col.value('@Cantidad', 'int'),
           Tbl.Col.value('@Folio', 'varchar(7)')
    
    FROM   @xml.nodes('//row') Tbl(Col)
    

    取自:

    1. http://kennyshu.blogspot.com/2007/12/convert-xml-file-to-table-in-sql-2005.html

    2. http://msdn.microsoft.com/en-us/library/ms345117(SQL.90).aspx

    【讨论】:

    • 包含您的源材料很棒。我还发现,您首先必须将 DB 中的 XML 字符串读取到变量中,然后才能对其进行处理。似乎没有办法 SELECT FROM 返回 XML 的子查询。
    • 显然我说得太早了。这篇文章介绍了如何选择没有变量的 XML:stackoverflow.com/a/18361423/271351。基本上你 CROSS APPLY 表中包含 XML 的表中的字段,然后从 CROSS APPLYed 字段中提取 NODES
    【解决方案2】:

    sp_xml_preparedocument 存储过程将解析 XML,OPENXML 行集提供程序将向您显示 XML 数据的关系视图。

    有关详细信息和更多示例请查看OPENXML documentation

    至于你的问题,

    DECLARE @XML XML
    SET @XML = '<rows><row>
        <IdInvernadero>8</IdInvernadero>
        <IdProducto>3</IdProducto>
        <IdCaracteristica1>8</IdCaracteristica1>
        <IdCaracteristica2>8</IdCaracteristica2>
        <Cantidad>25</Cantidad>
        <Folio>4568457</Folio>
    </row>
    <row>
        <IdInvernadero>3</IdInvernadero>
        <IdProducto>3</IdProducto>
        <IdCaracteristica1>1</IdCaracteristica1>
        <IdCaracteristica2>2</IdCaracteristica2>
        <Cantidad>72</Cantidad>
        <Folio>4568457</Folio>
    </row></rows>'
    
    DECLARE @handle INT  
    DECLARE @PrepareXmlStatus INT  
    
    EXEC @PrepareXmlStatus= sp_xml_preparedocument @handle OUTPUT, @XML  
    
    SELECT  *
    FROM    OPENXML(@handle, '/rows/row', 2)  
        WITH (
        IdInvernadero INT,
        IdProducto INT,
        IdCaracteristica1 INT,
        IdCaracteristica2 INT,
        Cantidad INT,
        Folio INT
        )  
    
    
    EXEC sp_xml_removedocument @handle 
    

    【讨论】:

    • 这很好用。更好的是,您可以使用现有表在 with 中定义架构。
    • 这是upload a file directly 的方法,而不是使用字符串(这不是一个极有可能的用例)。
    猜你喜欢
    • 2018-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    相关资源
    最近更新 更多