我有一个包含许多行的xml,我想将其转换为sql表。 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
答案 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 Method从Xml
类型
当您想要粉碎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])