Pozadí Mám XML sloupec v mé tabulky SQL (pomocí SQL Server). Každý uzel má různé množství metadat. Například, v příkladu níže, Krok Číslo 1 má pouze "Ne" jako metadata, zatímco, Krok Číslo 2 navíc má 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>
Očekávaný Výstup
Rád bych, aby extrahovat metadata dynamicky a zároveň popadl hodnotu. Pro výše uvedený příklad by vypadat jako níže uvedená tabulka. Důležitější je, nemělo by záležet na tom, jak mnoho metadata tagy tam jsou, chci, aby to jít přes všechny z nich. Některé z mých dat má 10+ kategorie.
Uzel | Krok | Klíč | Hodnota |
---|---|---|---|
Krok | 1 | Hodnota | Krok Číslo 1 |
Krok | 2 | RBuffer | 6000 |
Krok | 2 | Hodnota | Krok Číslo 2 |
Krok | 3 | Makro | 5 |
Krok | 3 | Hodnota | Krok Číslo 3 |
Práce tak daleko
Zatím jsem byl schopen extrahovat metadata ve statické způsobem:
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)
Což dává následující tabulka:
Krok | Makro | RBuffer | Akce |
---|---|---|---|
1 | NULL | NULL | Krok Číslo 1 |
2 | NULL | 6000 | Krok Číslo 2 |
3 | 5 | NULL | Krok Číslo 3 |
Ale musím explicitně volat každou hodnotu a vytváření sloupců tímto způsobem není škálovatelné. Jakýkoliv pomoci chtěl bych být ocenil. Jsem poměrně nový na tento druh dat munging v SQL, takže vysvětlení kód by být užitečné.