代码之家  ›  专栏  ›  技术社区  ›  Jay

根据子元素的最大值在SQL Server中选择XML节点

  •  2
  • Jay  · 技术社区  · 14 年前

    我试图从SQLServer2005XML数据类型中选择一些基于子节点中的最大数据量的值。

    <user>
       <name>Joe</name>
          <token>
             <id>ABC123</id>
             <endDate>2013-06-16 18:48:50.111</endDate>
          </token>
          <token>
             <id>XYX456</id>
             <endDate>2014-01-01 18:48:50.111</endDate>
          </token>
    </user>
    

    18:48:50.111

    我试图为xpath找到一个max函数,它可以让我选择正确的token元素,但找不到一个可行的。

    我也尝试过使用sqlmax函数,但我也无法使用该方法。

    [max(endDate)] 但还没有找到一种方法。

    下面是一个在我只有一个令牌时有效的示例:

    SELECT 
    XMLCOL.query('user/name').value('.','NVARCHAR(20)') as name
    XMLCOL.query('user/token/id').value('.','NVARCHAR(20)') as id
    XMLCOL.query('user/token/endDate').value(,'xs:datetime(.)','DATETIME') as endDate
    FROM MYTABLE
    
    1 回复  |  直到 14 年前
        1
  •  3
  •   marc_s    14 年前

    这个怎么样:

    SELECT 
        TOP 1
        XMLCOL.value('(/user/name)[1]', 'nvarchar(20)') as 'UserName',
        Usr.Token.value('(id)[1]', 'nvarchar(20)') AS 'ID',
        Usr.Token.value('(endDate)[1]', 'DateTime') as 'EndDate'
    FROM 
        dbo.MyTable
    CROSS APPLY
        xmlcol.nodes('/user/token') AS Usr(Token)
    ORDER BY
        Usr.Token.value('(endDate)[1]', 'DateTime') DESC
    

    基本上,您直接从XML中获取“原子”部分,如“UserName”,然后交叉应用/user/token列表并提取所需的各个位—您将得到一个包含三列(UserName、ID、EndDate)的结果集,您可以对它们进行排序和筛选。

    旁注:与此相反:

    XMLCOL.query('user/name').value('.','NVARCHAR(20)') 
    

    你为什么不用这个-感觉容易多了!

    XMLCOL.value('(/user/name)[1]', 'NVARCHAR(20)')