Использование переменной в хранимой процедуре SQL Server 2005 с XQuery - PullRequest
1 голос
/ 27 октября 2010

Я работаю со следующим 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>

Я пытаюсь сделать запрос из хранимой процедуры, чтобы получить метку для элемента, который имеет определенный ElementGU

Моя хранимая процедура выглядит следующим образом:

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

, где ElementGU - это поле, переданное в uniqueidentifier.

Кажется, мне не повезло с этим. Я читал, что вы не можете делать такого рода динамический запрос с XQuery, но в то же время вызов slq: variable () является частью XQuery, так есть ли кто-нибудь, кто может мне это объяснить?

Я все еще довольно новичок на фронте XQuery.

Ответы [ 2 ]

1 голос
/ 27 октября 2010

Вам нужно подойти к этому немного по-другому: поскольку у вас есть список <Element> узлов, я бы предложил вам создать список узлов, а затем выбрать правильный из этого списка - что-то вроде этого:

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

Я не знаю, как вы хотите выбрать из базовой таблицы - хотите ли вы иметь предложение WHERE или что-то - но CROSS APPLY в основном берет поле XML и создает «псевдотаблица» с именем AED.Element из узлов, указанных в выражении XPath, и перекрестно применяет их к базовой таблице.Итак, теперь для каждой записи в Control и каждого <Element> узла в этих строках вы получаете одну строку данных.

В этой строке вы можете теперь выбрать те строки, где значение @ElementGUсоответствует переданному вами значению, и для тех узлов XML, в которых это происходит, вы затем выбираете значение атрибута @Label

0 голосов
/ 27 октября 2010

Я думаю, что этот XPath (с sql:variable() функцией расширения) должен работать:

/AEDControl
 /Elements
  /Element[@ElementGU = sql:variable("@SelectedValueGU")]
   /@Label
...