2012-04-16 10 views
5

Come si restituisce la sequenza di elementi quando si sminuzza l'XML in righe in una vista di SQL Server?Conserva l'ordine degli elementi quando si distruggono dati XML in righe SQL

ingresso del campione:

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

output desiderato:

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

vista esistente:

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) 

risposta

11

È possibile utilizzare row_number() sul 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) 

Rif: Uniquely Identifying XML Nodes with DENSE_RANK di Adam Machanic.

Problemi correlati