Tło Mam kolumny XML w mojej tabeli SQL (z użyciem SQL Server). Każdy węzeł ma inną ilość metadanych. Na przykład w poniższym przykładzie Krok nr 1 zawiera jedyne "Nie" jako metadane, podczas gdy krok nr 2 dodatkowo zawiera 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>
Oczekiwany Wynik
Chciałbym dynamicznie wyodrębnić te metadane, jednocześnie wydobywając wartość. W powyższym przykładzie będzie to wyglądać jak w poniższej tabeli. Ważne jest, aby pamiętać, że nie powinno mieć znaczenia, ile jest znaczników metadanych, chcę, aby przeszedł przez wszystkie z nich. Niektóre z moich danych mają ponad 10 znaczników.
Węzeł | Krok | Klawisz | Wartość |
---|---|---|---|
Krok | 1 | Wartość | Krok nr 1 |
Krok | 2 | RBuffer | 6000 |
Krok | 2 | Wartość | Krok nr 2 |
Krok | 3 | Makro | 5 |
Krok | 3 | Wartość | Krok nr 3 |
Pracuje do tej pory
Do tej pory udało mi się pobierać metadane statycznym sposób:
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 daje następującą tabelę:
Krok | Makro | RBuffer | Działania |
---|---|---|---|
1 | zero | zero | Krok nr 1 |
2 | zero | 6000 | Krok nr 2 |
3 | 5 | zero | Krok nr 3 |
Ale muszę jawnie wywoływać każda wartość, a tworzenie kolumn w ten sposób nie jest skalowany. Każda pomoc będzie wdzięczna. Jestem stosunkowo nowy w tego rodzaju przetwarzania danych w SQL, więc podania kodu byłyby pomocne.