【问题标题】:Get the position of xml element in SQL Server 2012获取 xml 元素在 SQL Server 2012 中的位置
【发布时间】:2014-07-13 05:26:00
【问题描述】:

如何使用 SQL Server 2012 获取行的行号?

这里是xml

<Rows>
   <Row>Coating</Row>
   <Row>Drying</Row>
   <Row>Waxing</Row>
</Rows>

我需要这样返回的数据

RowLabel  RowNumber
-------------------
Coating    1
Drying     2
Waxing     3

【问题讨论】:

    标签: xml tsql sql-server-2012


    【解决方案1】:

    您可以使用一些关于 SQL Server 如何实现 XML 粉碎的内部知识,并像这样使用row_number()

    declare @XML xml = 
    '<Rows>
       <Row>Coating</Row>
       <Row>Drying</Row>
       <Row>Waxing</Row>
    </Rows>'
    
    select T.X.value('text()[1]', 'nvarchar(100)') as RowLabel,
           row_number() over(order by T.X) as RowNumber
    from @XML.nodes('/Rows/Row') as T(X)
    

    参考:Uniquely Identifying XML Nodes with DENSE_RANK

    或者您可以“谨慎行事”并使用数字表。

    select T.X.value('text()[1]', 'nvarchar(100)') as RowLabel,
           N.Number as RowNumber
    from Numbers as N
      cross apply @XML.nodes('/Rows/Row[sql:column("N.Number")]') as T(X)
    where N.Number between 1 and @XML.value('count(/Rows/Row)', 'int')
    

    【讨论】:

    【解决方案2】:

    在 XQuery 中有一种方法可以返回当前节点的位置:您可以计算它之前的所有节点

    SELECT T.X.value('text()[1]', 'nvarchar(100)') as RowLabel,
           T.X.value('let $i := . return count(/Rows/Row[. << $i]) + 1', 'int') as RowNumber
    FROM @xml.nodes('/Rows/Row') as T(X);
    

    这是做什么的:

    • 将当前节点赋值给变量$i
    • 获取/Rows/Row之前$i 的所有节点并计数
    • 然后加 1 使其从一开始

    在某些情况下你可能不想回到根节点,在这种情况下你可以使用..父轴

    SELECT T.X.value('text()[1]', 'nvarchar(100)') as RowLabel,
           T.X.value('let $i := . return count(../Row[. << $i]) + 1', 'int') as RowNumber
    FROM @xml.nodes('/Rows/Row') as T(X);
    

    您也可以通过更改为&gt;&gt; 从末尾倒数。

    dbfiddle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多