De fondo Tengo una columna XML en mi tabla de SQL (utilizando SQL Server). Cada nodo tiene una cantidad de metadatos. Por ejemplo, en el ejemplo de abajo, el Paso Número 1 es el único "No" como metadatos, mientras que, el Paso Número 2, además, tiene 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>
Resultado Esperado
Me gustaría extraer metadatos de forma dinámica mientras que también agarrar el valor. Para el ejemplo anterior, esto se vería de la siguiente tabla. Es importante destacar que, no importa cómo muchas etiquetas de metadatos hay, yo quiero ir a través de todos ellos. Algunos de mis datos tiene 10+ etiquetas.
Nodo | Paso | Clave | Valor |
---|---|---|---|
Paso | 1 | Valor | Paso Número 1 |
Paso | 2 | RBuffer | 6000 |
Paso | 2 | Valor | El Paso Número 2 |
Paso | 3 | Macro | 5 |
Paso | 3 | Valor | Paso Número 3 |
El trabajo hasta ahora
Hasta ahora, he sido capaz de extraer los metadatos de una manera 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)
Que da la siguiente tabla:
Paso | Macro | RBuffer | Acción |
---|---|---|---|
1 | NULL | NULL | Paso Número 1 |
2 | NULL | 6000 | El Paso Número 2 |
3 | 5 | NULL | Paso Número 3 |
Pero tengo que llamar explícitamente a cada valor y la creación de las columnas de esta manera no es escalable. Cualquier ayuda se agradece. Yo soy relativamente nuevo en este tipo de datos fotográficos en SQL, por lo que las explicaciones de código sería útil.