假设您有一个XML输入,如下所示:
<fusionlist>
<fusion>
<page number="2" sourcedocumentid="5"></page>
<page number="3" sourcedocumentid="6"></page>
</fusion>
<fusion>
<page number="1" sourcedocumentid="5"></page>
</fusion>
</fusionlist>
正如您所看到的,fusion是一组没有唯一标识符的值,并且使用经典SQL很难管理它(假设您想要迭代这些组。
并且您想要将值提取到Sql表(使用TSQL),因此您的输出将如下:
FusionTable
FusionGroupId | PageNumber | SourceDocumentId
1 2 5
1 3 6
2 1 5
生成FusionGroupId列的最佳选择是什么?
答案 0 :(得分:1)
首先查询要计算自动生成列的组,在这种情况下,它将是'fusionlist / fusion'。
然后选择 ROW_NUMBER()OVER(ORDER BY n.d)来获取该值,并使当前节点可用查询('。')。
之后,可以使用标准的 .value()调用来提取所需的数据。
SELECT
t.RowNumber,
fusion.value('(@sourcedocumentid)[1]','bigint') AS SourceDocumentId,
fusion.value('(@number)[1]','tinyint') AS PageNumber
FROM
(
SELECT
ROW_NUMBER() OVER(ORDER BY n.d) AS RowNumber,
n.d.query('.') query
FROM
@FusionSourceXml.nodes('fusionlist/fusion') n(d)
)t
CROSS APPLY
t.query.nodes('fusion/page') AS x(fusion)
会产生:
1 5 2
1 6 3
2 5 1