我有以下 xml 数据
<browse result="1">
<th>
<td label="Company ID"></td>
<td label="Company Name"></td>
<td label="Country"></td>
<td label="Region"></td>
</th>
<tr>
<td>ABC01</td>
<td>Company 1</td>
<td>United States</td>
<td>North America</td>
</tr>
<tr>
<td>ABC02</td>
<td>Company 2</td>
<td>China</td>
<td>Asia</td>
</tr>
</browse>
我的决赛桌应该是这样的
公司ID | 公司名称 | 国家 | 地区 |
---|---|---|---|
ABC01 | 公司1 | 美国 | 北美 |
ABC02 | 公司2 | 中国 | 亚洲 |
或其旋转版本
标签 | 值1 | 值2 |
---|---|---|
公司ID | ABC01 | ABC02 |
公司名称 | 公司1 | 公司2 |
国家 | 美国 | 中国 |
地区 | 北美 | 亚洲 |
这是我到目前为止所尝试过的
declare @xmldata nvarchar(4000) = '<browse result="1">
<th>
<td label="Company ID"></td>
<td label="Company Name"></td>
<td label="Country"></td>
<td label="Region"></td>
</th>
<tr>
<td>ABC01</td>
<td>Company 1</td>
<td>United States</td>
<td>North America</td>
</tr>
<tr>
<td>ABC02</td>
<td>Company 2</td>
<td>China</td>
<td>Asia</td>
</tr>
</browse>'
select
a.value('@label', 'varchar(max)') as label
,b.value('.', 'nvarchar(max)') as value
from (select top (1) CAST(REPLACE(CAST(@xmldata AS NVARCHAR(MAX)),'utf-8','utf-16') AS XML) as xmldata) as s
outer apply s.xmldata.nodes('/browse/th/td') as l(a)
outer apply s.xmldata.nodes('/browse/tr/td') as v(b)
但它给了我 32 行,其中大部分是 4 个标签与值的错误重复组合。我应该如何实现这个目标?
如果我们可以假设这些值处于静态位置,那么您只需要查看
tr
节点,然后使用它们的序数位置从中获取每个 td
节点:
DECLARE @xml xml = '<browse result="1">
<th>
<td label="Company ID"></td>
<td label="Company Name"></td>
<td label="Country"></td>
<td label="Region"></td>
</th>
<tr>
<td>ABC01</td>
<td>Company 1</td>
<td>United States</td>
<td>North America</td>
</tr>
<tr>
<td>ABC02</td>
<td>Company 2</td>
<td>China</td>
<td>Asia</td>
</tr>
</browse>';
SELECT b.th.value('td[1]','varchar(20)') AS CompanyID,
b.th.value('td[2]','varchar(20)') AS CompanyName,
b.th.value('td[3]','varchar(20)') AS Country,
b.th.value('td[4]','varchar(20)') AS Region
FROM @xml.nodes('browse/tr') b(th);