Используя переменную в сохраненной процедуре SQL Server 2005 с XQuery
-
26-09-2019 - |
Вопрос
Я работаю со следующим 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>
Я пытаюсь запрашивать из сохраненной процедуры, чтобы вернуть этикетку на элементе, который имеет определенный элемент
Моя хранимая процедура выглядит так:
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: переменная () Call является частью XQuery, так что есть кто-нибудь там, что может очистить это для меня?
Я все еще довольно новый на передней части XQuery.
Решение
Вам нужно подойти немного по-другому: так как у вас есть список <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
Я не знаю, как вы хотите выбрать из вашей базовой таблицы - хотите ли вы иметь предложение там или что-то еще что-то - но кросс применяется в основном, принимает поле XML и создает «псевдостопный» AED.Element
Из узлов, приведенных в выражении XPath, и Cross - применяет те к базовой таблице. Так что теперь для каждой записи в Control
и каждый <Element>
Узел в этих рядах, вы получаете один ряд данных.
В этом ряду теперь вы можете выбрать эти ряды, где @ElementGU
Значение соответствует значению, которое вы передали, и для этих узлов XML, где это так, вы выбираете значение @Label
атрибут
Другие советы
Я думаю, что это XPath (с sql:variable()
Функция расширения) должна работать:
/AEDControl
/Elements
/Element[@ElementGU = sql:variable("@SelectedValueGU")]
/@Label