Gostaria de dinamizar os atributos e valores de uma coluna SQL XML e exibi-la em um formato ordenado de colunas e linhas.
Para começar, é assim que a coluna XML se parece no SQL:
<Model xmlns:dsc="ModelDescriptive" xmlns:draw="ModelDraw" xmlns:display="Display" xmlns:thd="Model3D">
<dsc:Model name="15DE">
<dsc:Defs>
<dsc:Materials>
<dsc:Material ref="E-HD-AnoAno" baseRef="E-HD" type="rod" productionGroup="OPTION" />
<dsc:Material ref="E-3L44A-CLEAR" baseRef="E-3L44A" type="piece" productionGroup="OPTION" />
<dsc:Material ref="R-TH01" baseRef="R-TH-TH" type="rod" productionGroup="ASSEMBLY" />
<dsc:Material ref="M-TH05" baseRef="M-TH" type="meter" productionGroup="MOLDING" />
</dsc:Materials>
</dsc:Defs>
</dsc:Model>
</Model>
… e aqui está minha pergunta:
SELECT
x.y.value('local-name(..)', 'VARCHAR(MAX)') ParentElementName
,x.y.value('local-name(.)', 'VARCHAR(MAX)') Attribut
,x.y.value('.', 'VARCHAR(MAX)') Value
,Row_number() Over(Partition by x.y.value('local-name(..)', 'VARCHAR(MAX)') order by x.y.value('local-name(..)', 'VARCHAR(MAX)') ASC) as rn
FROM @xmlDescriptive.nodes('//*[text()], //@*') AS x(y)
WHERE x.y.value('local-name(..)', 'VARCHAR(MAX)')= 'Material'
ORDER BY x.y.value('local-name(..)', 'VARCHAR(MAX)')
Obtenho um resultado interessante usando o método Nodes do XQuery e filtrando apenas o material da lista de materiais (BOM).
No entanto, gostaria de apresentar os dados de forma padronizada.
O primeiro resultado que recebo é assim:
Então eu transformo esse resultado para girá-lo usando o método Pivot. Aqui está o meu método de tentar dinamizar minhas informações:
SELECT [ref], [baseRef], [type], [productionGroup]
FROM
(
SELECT
x.y.value('local-name(..)', 'VARCHAR(MAX)') ParentElementName
,x.y.value('local-name(.)', 'VARCHAR(MAX)') Attribut
,x.y.value('.', 'VARCHAR(MAX)') Valeur
,CAST(Row_number() Over(Partition by x.y.value('local-name(.)', 'VARCHAR(MAX)') order by x.y.value('local-name(..)', 'VARCHAR(MAX)') ASC) as varchar(10)) as rn
FROM @xmlDescriptive.nodes('//@*') AS x(y)
WHERE x.y.value('local-name(..)', 'VARCHAR(MAX)')= 'Material'
) d
pivot
(
max(Valeur)
FOR Attribut in ([ref], [baseRef], [type], [productionGroup])
) piv
E acho que meu resultado está desordenado. A coluna ref não corresponde às minhas colunas baseRef , type e productGroup :
Eu estou um pouco confuso. Eu gostaria de ter meu resultado formatado dessa maneira, mas ordenado. O que há de errado com meu raciocínio?
Gostaria que meu resultado fosse apresentado assim:
Provavelmente estou perdendo o ponto de sua pergunta, mas aqui está o que eu faria para obter o resultado que você está procurando.
Seu uso de
local-name()
e//*[text()], //@*'
sugere que você deseja algum tipo de pivô genérico, mas você usaMaterial
e os nomes de atributos codificados na consulta, então não sei por que você seguiu esse caminho.