1

我正在使用以下 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 方面还是个新手。

4

2 回答 2

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 字段并创建一个AED.Element从给定节点调用的“伪表” XPath 表达式,并将它们交叉应用到基表。所以现在,对于这些行中的每个条目Control和每个<Element>节点,您将获得一行数据。

在该行中,您现在可以选择@ElementGU值与您传入的值相对应的那些行,然后对于出现这种情况的那些 XML 节点,您可以选择@Label属性的值

于 2010-10-26T21:16:44.850 回答
0

我认为这个 XPath(带有sql:variable()扩展功能)应该可以工作:

/AEDControl
 /Elements
  /Element[@ElementGU = sql:variable("@SelectedValueGU")]
   /@Label
于 2010-10-26T21:22:50.783 回答