SQL 服务器将 XML 解析为 table - 具有相同名称的多个节点,第一个节点应为 table 列
SQL Server parse XML to table - multiple node with the same name and first node should be table columns
我有一个来源 xml,如下所示,我想转换为 SQL table。第一个“tr”节点应该是 table 的列,其余是行。
<table>
<tbody>
<tr>
<td>Description</td>
<td>Value</td>
<td>Reference</td>
<td>Category</td>
<td>Review</td>
</tr>
<tr>
<td>Process Param</td>
<td>|ABCD|</td>
<td>Step1</td>
<td>Process</td>
<td>False</td>
</tr>
<tr>
<td>Config Param</td>
<td>|EFGH|</td>
<td>Step2</td>
<td>Config</td>
<td>True</td>
</tr>
<tr>
<td>Process Param</td>
<td>|IJKL|</td>
<td>Step3</td>
<td>Process</td>
<td>False</td>
</tr>
</tbody>
</table>
预期SQL输出:
Output
您可以使用为 xml 数据类型提供的 nodes
方法从 html/xml 结构中提取数据(更多信息 here)。
这是一个简单的查询,应该会让您走上正轨:
select
Tbl.Col.value('td[1]', 'varchar(50)')
,Tbl.Col.value('td[2]', 'varchar(50)')
,Tbl.Col.value('td[3]', 'varchar(50)')
,Tbl.Col.value('td[4]', 'varchar(50)')
,Tbl.Col.value('td[5]', 'varchar(50)')
from @x.nodes('//tr') Tbl(Col)
其中@x 是一个 xml 变量,其中包含您的 xml:
declare @x xml = '<table>...
问题是返回了第一行(包含列 headers)
数据集内:
如果您想将第一行中的值用作列名,则必须编写动态 xml.
我有一个来源 xml,如下所示,我想转换为 SQL table。第一个“tr”节点应该是 table 的列,其余是行。
<table>
<tbody>
<tr>
<td>Description</td>
<td>Value</td>
<td>Reference</td>
<td>Category</td>
<td>Review</td>
</tr>
<tr>
<td>Process Param</td>
<td>|ABCD|</td>
<td>Step1</td>
<td>Process</td>
<td>False</td>
</tr>
<tr>
<td>Config Param</td>
<td>|EFGH|</td>
<td>Step2</td>
<td>Config</td>
<td>True</td>
</tr>
<tr>
<td>Process Param</td>
<td>|IJKL|</td>
<td>Step3</td>
<td>Process</td>
<td>False</td>
</tr>
</tbody>
</table>
预期SQL输出: Output
您可以使用为 xml 数据类型提供的 nodes
方法从 html/xml 结构中提取数据(更多信息 here)。
这是一个简单的查询,应该会让您走上正轨:
select
Tbl.Col.value('td[1]', 'varchar(50)')
,Tbl.Col.value('td[2]', 'varchar(50)')
,Tbl.Col.value('td[3]', 'varchar(50)')
,Tbl.Col.value('td[4]', 'varchar(50)')
,Tbl.Col.value('td[5]', 'varchar(50)')
from @x.nodes('//tr') Tbl(Col)
其中@x 是一个 xml 变量,其中包含您的 xml:
declare @x xml = '<table>...
问题是返回了第一行(包含列 headers) 数据集内:
如果您想将第一行中的值用作列名,则必须编写动态 xml.