Pergunta

Estou trabalhando com o seguinte XML

<AEDControl ControlGU="17fed98c-8128-4c6b-9b50-3dbe73889b9d" 
            ControlLabel="Posting Status" 
            TypeGU="6b4d08b1-6340-450c-beae-517b7d84e717" 
            ControlDescription="">
  <Elements>
    <Element ElementGU="2da346d1-2e05-4aa3-9bae-5aa9b3b75d5c" 
             Label="Active" 
             IsDefault="false"/>
    <Element ElementGU="fa8966fc-c796-4482-9ee1-f619910dc86e" 
             Label="Closed" 
             IsDefault="false"/>
    <Element ElementGU="d701a7d7-c3bd-496b-8d4b-b854a6937c3a" 
             Label="Filled" 
             IsDefault="false"/>
    <Element ElementGU="75af1941-f14f-4b7e-9f1e-5b6852c4a4f7" 
             Label="New" 
             IsDefault="false"/>
    <Element ElementGU="aa54e387-608e-4758-b4f2-c1dc485a5576" 
             Label="Pending" 
             IsDefault="true"/>
    <Element ElementGU="210aef5c-e4cf-4987-815f-0e4274b45e08" 
             Label="Scratch" 
             IsDefault="false"/>
 </Elements>

Estou tentando consultar um procedimento armazenado para recuar um rótulo no elemento que tem um elemento específico

Meu procedimento armazenado se parece com o seguinte:

SELECT 
   CAST(CONTROL_XML.query('data(/AEDControl/Elements/Element/@Label)') as varchar(100)) as ControlLabel 
FROM 
   Control
WHERE 
   CONTROL_XML.exist('/AEDControl/Elements/Element[@ElementGU = sql:variable("@SelectedValueGU")]') = 1

Onde ElementGU é um passado em uniqueidentifier campo.

Parece que não estou tendo sorte com isso. Eu li que você não pode fazer esse tipo de consulta dinâmica com o XQuery, mas, ao mesmo tempo, a chamada SLQ: Variable () faz parte do XQuery, então há alguém por aí que pode esclarecer isso para mim?

Ainda sou bastante novo na frente XQuery.

Foi útil?

Solução

Você precisa abordar isso de maneira um pouco diferente: já que você tem uma lista de <Element> nós, eu sugiro que você crie uma lista de nós e depois escolha o direito dessa lista - algo assim:

SELECT 
    AED.Element.value('(@Label)[1]', 'varchar(100)') as ControlLabel 
FROM
    Control
CROSS APPLY
    Control_XML.nodes('/AEDControl/Elements/Element') AS AED(Element)
WHERE
AED.Element.value('(@ElementGU)[1]', 'uniqueidentifier') = @SelectedValueGU

Não sei como você deseja selecionar da sua tabela de base - se você deseja ter uma cláusula onde ou algo assim - mas a cruz se aplica basicamente pega o campo XML e cria uma "pseudo -mesa" chamada AED.Element Dos nós fornecidos na expressão do XPath, e aplica-os à tabela de base. Então agora, para cada entrada em Control e cada um <Element> Nó nessas linhas, você obtém uma linha de dados.

Naquela linha, agora você pode escolher aquelas linhas onde o @ElementGU O valor corresponde ao valor em que você passou e para os nós XML onde esse é o caso, você seleciona o valor do @Label atributo

Outras dicas

Eu acho que este XPath (com sql:variable() função de extensão) deve funcionar:

/AEDControl
 /Elements
  /Element[@ElementGU = sql:variable("@SelectedValueGU")]
   /@Label
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top