2012-04-16 7 views
5

¿Cómo devuelvo la secuencia de elementos al triturar XML en filas en una vista de SQL Server?Conservar el orden de elementos al triturar datos XML en filas SQL

Ejemplo de entrada:

<ol> 
    <li>Smith</li> 
    <li>Jones</li> 
    <li>Brown</li> 
</ol> 

salida deseada:

Sequence Name 
-------- ----------- 
    1  Smith 
    2  Jones 
    3  Brown 

vista existente:

CREATE VIEW OrderedList 
AS 
SELECT [Sequence] = CAST(NULL AS int) -- TODO: Get ordinal position 
     [Name] = b.b.value('.', 'nvarchar(max)') 
FROM 
(
    SELECT a = CAST('<ol><li>Smith</li><li>Jones</li><li>Brown</li></ol>' AS xml) 
) a 
CROSS APPLY a.a.nodes('/ol/li') b (b) 

Respuesta

11

Puede utilizar row_number() en el nodo XML.

CREATE VIEW OrderedList 
AS 
SELECT [Sequence] = ROW_NUMBER() OVER(ORDER BY b.b), 
     [Name] = b.b.value('.', 'nvarchar(max)') 
FROM 
(
    SELECT a = CAST('<ol><li>Smith</li><li>Jones</li><li>Brown</li></ol>' AS xml) 
) a 
CROSS APPLY a.a.nodes('/ol/li') b (b) 

Ref: Uniquely Identifying XML Nodes with DENSE_RANK de Adam Machanic.

Cuestiones relacionadas