Usando uma variável em um procedimento armazenado do SQL Server 2005 com XQuery
-
26-09-2019 - |
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.
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