Sfondo Ho una colonna XML nella mia tabella di SQL (utilizzando SQL Server). Ogni nodo ha una diversa quantità di metadati. Per esempio, nell'esempio di seguito, Passo Numero 1 è l'unico "No" come metadati, mentre, Passo Numero 2, inoltre, RBuffer.
<Step No="1" >Step Number 1</Step>
<Step No="2" RBuffer="6000">Step Number 2</Step>
<Step No="3" Macro="5">Step Number 3</Step>
Uscita Prevista
Vorrei estrarre i metadati in modo dinamico mentre anche afferrando il valore. Per l'esempio precedente, questo sarebbe simile alla tabella che segue. Soprattutto, non dovrebbe importa quante tag di metadati ci sono, voglio andare attraverso tutti loro. Alcuni dei miei dati 10+ tag.
Nodo | Passo | Chiave | Valore |
---|---|---|---|
Passo | 1 | Valore | Passo Numero 1 |
Passo | 2 | RBuffer | 6000 |
Passo | 2 | Valore | Passo Numero 2 |
Passo | 3 | Macro | 5 |
Passo | 3 | Valore | Passo Numero 3 |
Il lavoro finora
Finora, sono stato in grado di estrarre i metadati in modo statico:
SELECT o.value('@No', 'varchar(32)') [Step]
,o.value('@Macro', 'varchar(32)') [Macro]
,o.value('@RBuffer', 'varchar(32)') [RBuffer]
,o.value('(text())[1]', 'varchar(32)') [Action]
FROM [dbo].[dw_mrd_vss_rundetail_stg] S
CROSS APPLY S.[rundata_detail].nodes('Step') xmlData(o)
Che ha pronunciato la seguente tabella:
Passo | Macro | RBuffer | Azione |
---|---|---|---|
1 | NULL | NULL | Passo Numero 1 |
2 | NULL | 6000 | Passo Numero 2 |
3 | 5 | NULL | Passo Numero 3 |
Ma devo chiamare in modo esplicito ogni valore, e la creazione di colonne in questo modo non è scalabile. Qualsiasi aiuto sarebbe apprezzato. Io sono relativamente nuovo a questo tipo di dati munging in SQL, in modo da spiegazioni di codice sarebbe utile.