我正在使用以下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方面仍然相当新。
答案 0 :(得分:1)
您需要稍微改变一下:因为您有一个<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字段并创建一个名为{{1的“伪表”从XPath表达式中给出的节点开始,并将它们交叉应用于基表。现在,对于AED.Element
中的每个条目以及这些行中的每个Control
节点,您将获得一行数据。
在该行中,您现在可以选择<Element>
值对应于您传入的值的那些行,对于那些在这种情况下的XML节点,您可以选择{{{ 1}}属性
答案 1 :(得分:0)
我认为这个XPath(带sql:variable()
扩展功能)应该可以工作:
/AEDControl
/Elements
/Element[@ElementGU = sql:variable("@SelectedValueGU")]
/@Label