Olhando para o meu campo XML, minhas linhas se parecem com isto:
<person><firstName>Jon</firstName><lastName>Johnson</lastName></person>
<person><firstName>Kathy</firstName><lastName>Carter</lastName></person>
<person><firstName>Bob</firstName><lastName>Burns</lastName></person>
Observe que essas são três linhas em minha tabela.
Eu gostaria de retornar um resultado SQL como uma tabela como em
Jon | Johnson
Kathy| Carter
Bob | Burns
Que consulta fará isso?
sql-server
xml
xpath
Larsenal
fonte
fonte
Respostas:
Dado que o campo XML é denominado 'xmlField' ...
fonte
The XQuery syntax '/function()' is not supported.
:; Por outro lado, @Remus Rusanu parece fazer isso :)<BAM><Type>Electrical</Type><BaIds><a:int>7330</a:int></BaIds></BAM>
, meu select éselect e.MessageData.value('(/BAM/Type)[1]', 'varchar(100)')
. Eu também tentei selecte.MessageData.value('(/BAM/Type/node())[1]', 'varchar(100)')
, e'(//Type/node())[1]'
,'(./Type)[1]'
e todas as outras combinações que eu posso pensar. Tudo que eu consigo éNULL
.Considerando que os dados XML vêm de uma tabela 'tabela' e são armazenados em uma coluna 'campo': use os métodos XML , extraia valores com
xml.value()
, nós do projeto comxml.nodes()
, useCROSS APPLY
para juntar:Você pode descartar o
nodes()
ecross apply
se cada campo contiver exatamente um elemento 'pessoa'. Se o XML for uma variável que você selecionaFROM @variable.nodes(...)
e não precisa docross apply
.fonte
Esta postagem foi útil para resolver meu problema que tem um formato XML um pouco diferente ... meu XML contém uma lista de chaves como o exemplo a seguir e eu armazeno o XML na coluna SourceKeys em uma tabela chamada DeleteBatch:
Crie a tabela e preencha-a com alguns dados:
Aqui está meu SQL para selecionar as chaves do XML:
Aqui estão os resultados da consulta ...
fonte
Isso pode responder à sua pergunta:
fonte
Caramba. Este foi um tópico realmente útil para descobrir.
Ainda achei algumas dessas sugestões confusas. Sempre que usei
value
com[1]
na string, ele recuperaria apenas o primeiro valor. E algumas sugestões recomendaram usar ocross apply
que (em meus testes) apenas trouxe de volta muitos dados.Portanto, aqui está meu exemplo simples de como você criaria um
xml
objeto e, em seguida, leria seus valores em uma tabela.E aqui está o resultado:
É uma sintaxe bizarra, mas com um exemplo decente, é fácil de adicionar às suas próprias funções do SQL Server.
Falando nisso, aqui está a resposta correta para essa pergunta.
Supondo que você tenha seus dados xml em uma
@xml
variável do tipoxml
(conforme demonstrado no meu exemplo acima), veja como você retornaria as três linhas de dados do xml citado na pergunta:fonte
[1]
o ordinal do índice para forçá-lo a retornar 1 linha ou aplicar a colunanodes()
para obter um estrutura que pode ter xpath executado contra ele. Seu código não se traduz nesse cenário sem muitas modificações. Você está usando uma variável, não uma coluna da tabela. Você também está usando demais aquery()
função que retorna xml. por exemplo, você poderia ter apenasx.Rec.value('(./firstName)[1]', 'nvarchar(2000)') AS FirstName
Se você for capaz de envolver seu XML em um elemento raiz - digamos que a solução a seguir seja:
fonte
MSSQL usa regras XPath regulares da seguinte maneira:
W3Schools
fonte
fonte
/ * Este exemplo usa uma variável XML com um esquema * /
fonte