鉴于XML:
<Dial>
<DialID>
24521
</DialID>
<DialName>
Base Price
</DialName>
</Dial>
<Dial>
<DialID>
24528
</DialID>
<DialName>
Rush Options
</DialName>
<DialValue>
1.5
</DialValue>
</Dial>
<Dial>
<DialID>
24530
</DialID>
<DialName>
Bill Rush Charges
</DialName>
<DialValue>
School
</DialValue>
</Dial>
我可以在xpath中使用contains()函数:
//Dial[DialName[contains(text(), 'Bill')]]/DialValue
要检索我想要的值:
School
上面的XML存储在SQL数据库的一个字段中,因此我正在使用.value方法从该字段中进行选择。
SELECT Dials.DialDetail.value('(//Dial[DialName[contains(text(), "Bill")]]/DialValue)[1]','VARCHAR(64)') AS BillTo
FROM CampaignDials Dials
我似乎似乎语法不正确... xpath可以按预期工作(在Oxygen和其他地方进行了测试),但是当我在.value()方法的XQuery参数中使用它时,出现了一个错误:
Started executing query at Line 1
Msg 2389, Level 16, State 1, Line 36
XQuery [Dials.DialDetail.value()]: 'contains()' requires a singleton (or empty sequence), found operand of type 'xdt:untypedAtomic *'
Total execution time: 00:00:00.004
我尝试了单引号和双引号的不同变体,但没有任何效果。该错误是针对属性的XPath数据类型,但我没有检索属性;我正在获取文本值。如果我用// Dial [DialName [contains(text(),'Bill')]] / DialValue / text()代替键入响应,则会收到相同的错误。
在方法中使用contains()
XQuery的正确方法是什么XML.value()
?还是这是错误的方法?
您几乎是正确的,您只需要[1]
在text()
函数上保证单个值即可。
text()
由于性能原因,您还应该在要拔出的实际节点上使用。
另外,//
它效率低下,因此仅在确实需要递归下降时才使用它。您可以改用/*/
获取任何名称的第一个节点。
SELECT
Dials.DialDetail.value(
'(//Dial[DialName[contains(text()[1], "Bill")]]/DialValue/text())[1]',
'VARCHAR(64)') AS BillTo
FROM CampaignDials Dials
正如Yitzhak Kabinsky指出的那样,这仅使表的每一行为您提供一个值,.nodes
如果您想将XML本身切成行,则需要这样做。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句