Fundo Eu tenho uma coluna de XML no SQL tabela (usando o SQL Server). Cada nó tem uma quantidade diferente de metadados. Por exemplo, no exemplo abaixo, o Passo Número 1 tem o único "Não" como metadados enquanto, o Passo Número 2, além disso tem a 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>
Saída Esperada
Eu gostaria de extrair metadados de forma dinâmica enquanto também agarrando o valor. Para o exemplo acima, isto seria como mostra a tabela abaixo. Importante, não importa quantas marcas de metadados existem, eu quero que ele vá através de todos eles. Alguns dos meus dados tem 10+ tags.
Nó | Passo | Chave | Valor |
---|---|---|---|
Passo | 1 | Valor | Passo Número 1 |
Passo | 2 | RBuffer | 6000 |
Passo | 2 | Valor | Passo Número 2 |
Passo | 3 | Macro | 5 |
Passo | 3 | Valor | Passo Número 3 |
O trabalho até agora
Até agora, eu fui capaz de extrair os metadados de forma estática:
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)
O que dá a tabela a seguir:
Passo | Macro | RBuffer | Ação |
---|---|---|---|
1 | NULL | NULL | Passo Número 1 |
2 | NULL | 6000 | Passo Número 2 |
3 | 5 | NULL | Passo Número 3 |
Mas eu tenho que chamar explicitamente cada valor e a criação de colunas desta forma, não é escalável. Qualquer ajuda seria apreciada. Eu sou relativamente novo para este tipo de adulterar dados em SQL, portanto, explicações de código seria útil.