【发布时间】:2021-06-01 08:09:59
【问题描述】:
给定 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() 代替输入响应,我会收到相同的错误。
当在XML.value() 方法中使用contains() 时,在XQuery 中使用contains() 的正确方法是什么?或者这是错误的开始方式?
【问题讨论】:
-
在提出问题时,您需要提供一个可重现的最小示例。请参考以下链接:stackoverflow.com/help/minimal-reproducible-example 请提供以下内容: (1) DDL 和样本数据填充,即 CREATE table(s) 加上 INSERT T-SQL 语句。 (2) 你需要做什么,即逻辑和你的代码尝试在 T-SQL 中实现它。 (3) 期望的输出,基于上面#1 中的样本数据。 (4) 你的 SQL Server 版本 (SELECT @@version;)
标签: sql-server xml xpath xquery