【问题标题】:Choose a XML node in SQL Server based on max value of a child element根据子元素的最大值在 SQL Server 中选择 XML 节点
【发布时间】:2011-03-04 23:00:08
【问题描述】:

我正在尝试根据位于子节点中的最大数据从 SQL Server 2005 XML 数据类型中选择一些值。

我在 SQL Server 的一个字段中存储了多行带有类似于以下内容的 XML 行:

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

我想从此 XML 列中执行选择,它确定令牌元素中的最大日期,并为每条记录返回类似于以下结果的数据行:

乔 XYZ456 2014-01-01 18:48:50.111

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

我也尝试使用 SQL MAX 函数,但我也无法使用该方法。

如果我只有一个标记,它当然可以正常工作,但是当我有多个标记时,我得到一个 NULL,很可能是因为查询不知道要提取哪个日期。我希望有一种方法可以在令牌元素上指定 where 子句 [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

【问题讨论】:

    标签: xml sql-server-2005 tsql xpath


    【解决方案1】:

    这个怎么样:

    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 中获取像“用户名”这样的“原子”部分,然后交叉应用 /user/token 列表并提取您想要的各个位 - 您会得到一个包含三列的结果集(用户名、 ID、EndDate),您可以对它们进行排序和过滤。

    旁注:而不是这个:

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

    你为什么不使用它 - 感觉更容易!

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

    【讨论】:

    • CROSS APPLY 成功了。这不是我所需要的,但你指出了我正确的方向。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多