将带有重复元素的XML转换为SQL表

时间:2014-12-25 16:43:17

标签: sql-server xml

我有一个包含许多行的xml,我想将其转换为sql表。  xml有重复元素,我想检索数据,因此表中的每一行都将包含所有列名(一行中的所有字段名)及其值。

"所有元素都有字段名="所以我似乎无法将它们中的每一个分成不同的列并应用它的值

  • 我在网上搜索但找不到 适合这种xml的东西

这是我的XML

<resultset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<field name="id_report">1</field>

<field name="title_report" xsi:nil="true"/>

<field name="loan_taken_flag">1</field>

<field name="structured_text_flag">0</field>

</row>

<row>

<field name="id_report">2</field>

<field name="title_report" xsi:nil="true"/>

<field name="loan_taken_flag">0</field>

<field name="structured_text_flag">0</field>

</row>

</resultset>

输出应该如下所示

 id_report title_report  loan_taken_flag structured_text_flag
  1  NULL  1   0

  2  Null  0   0

这是我到目前为止所得到的,但我只能得到元素的名称和值出现在2列但我说我想要每个元素的列

DECLARE @XML XML
SELECT @XML = XMLData FROM dbo.XMLwithOpenXML

DECLARE @handle INT  
DECLARE @PrepareXmlStatus nvarchar(max)

EXEC @PrepareXmlStatus= sp_xml_preparedocument @handle OUTPUT, @XML  


 SELECT  FieldName,FieldValue
 FROM    OPENXML(@handle, '/resultset/row/field',2)
 WITH (


        FieldName  varchar(50) '@name',
       FieldValue varchar(500) '.'       
   )

 EXEC sp_xml_removedocument @handle 

2 个答案:

答案 0 :(得分:1)

使用nodes()粉碎/resultset/row并在@name的values函数中使用谓词来提取每列的值。

declare @XML xml = '
<resultset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <row>
    <field name="id_report">1</field>
    <field name="title_report" xsi:nil="true"/>
    <field name="loan_taken_flag">1</field>
    <field name="structured_text_flag">0</field>
  </row>
  <row>
    <field name="id_report">2</field>
    <field name="title_report" xsi:nil="true"/>
    <field name="loan_taken_flag">0</field>
    <field name="structured_text_flag">0</field>
  </row>
</resultset>'

select T.X.value('(field[@name = "id_report"]/text())[1]', 'int') as id_report,
       T.X.value('(field[@name = "title_report"]/text())[1]', 'varchar(100)') as title_report,
       T.X.value('(field[@name = "loan_taken_flag"]/text())[1]', 'bit') as loan_taken_flag,
       T.X.value('(field[@name = "structured_text_flag"]/text())[1]', 'bit') as structured_text_flag
from @XML.nodes('/resultset/row') as T(X)

结果:

id_report   title_report loan_taken_flag structured_text_flag
----------- ------------ --------------- --------------------
1           NULL         1               0
2           NULL         0               0

答案 1 :(得分:0)

使用Nodes MethodXml类型

中提取数据
  

当您想要粉碎xml数据类型时,nodes()方法很有用   实例到关系数据。它允许您识别那些节点   将被映射到一个新行。

尝试这样的事情。

DECLARE @XML XML

SELECT @XML = '<resultset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<row>
<field name="id_report">1</field>
<field name="title_report" xsi:nil="true"/>
<field name="loan_taken_flag">1</field>
<field name="structured_text_flag">0</field>
</row>
<row>
<field name="id_report">2</field>
<field name="title_report" xsi:nil="true"/>
<field name="loan_taken_flag">0</field>
<field name="structured_text_flag">0</field>
</row>
</resultset>'

SELECT id_report = [Xml_Tab].[Cols].value('(field)[1]', 'int'),
       title_report= [Xml_Tab].[Cols].value('(field)[2]', 'varchar(50)'),
       loan_taken_flag = [Xml_Tab].[Cols].value(' (field)[3]', 'Bit'),
       structured_text_flag=[Xml_Tab].[Cols].value(' (field)[4]', 'Bit')
FROM   @XML.nodes('/resultset/row') AS [Xml_Tab]([Cols])