如何为XML查询生成自动增量列?

时间:2016-12-19 14:39:22

标签: xml tsql xpath

假设您有一个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列的最佳选择是什么?

1 个答案:

答案 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