Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wählen Sie einen XML-Knoten in SQL Server basierend auf dem maximalen Wert eines untergeordneten Elements aus

Wie wäre es damit:

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

Sie nehmen im Grunde den "atomaren" Teil wie "UserName" direkt aus dem XML und wenden dann eine Liste von /user/token an und extrahieren die einzelnen gewünschten Bits - Sie erhalten eine Ergebnismenge aus drei Spalten (UserName, ID, EndDate ) und Sie können diese sortieren und filtern.

Randnotiz:Statt dessen:

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

warum benutzt du das nicht - fühlt sich viel einfacher an!

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