XML query() 有效,value() 需要找到单例 xdt:untypedAtomic
Posted
技术标签:
【中文标题】XML query() 有效,value() 需要找到单例 xdt:untypedAtomic【英文标题】:XML query() works, value() requires singleton found xdt:untypedAtomic 【发布时间】:2010-11-21 02:02:14 【问题描述】:我有一个以文本形式存储的类型化 xml 文档。因此,我使用通用表表达式将数据类型转换为 xml,以便能够使用 XML 方法:
WITH xoutput AS (
SELECT CONVERT(xml, t.requestpayload) 'requestpayload'
FROM TABLE t
WHERE t.methodid = 1)
SELECT x.requestpayload.query('declare namespace s="http://blah.ca/api";/s:validate-student-request/s:student-id') as studentid
FROM xoutput x
查询有效,将元素返回给我。但我只对价值感兴趣:
WITH xoutput AS (
SELECT CONVERT(xml, t.requestpayload) 'requestpayload'
FROM TABLE t
WHERE t.methodid = 1)
SELECT x.requestpayload.value('declare namespace s="http://blah.ca/api";/s:validate-student-request/s:student-id', 'int') as studentid
FROM xoutput x
这给了我以下错误:
'value()' 需要一个单例(或空序列),找到类型为 'xdt:untypedAtomic *' 的操作数
我用谷歌搜索的内容是 XPATH/XQUERY 需要在括号内和/或需要“[1]” - 两者都没有工作。 xml 中只有一个 student-id 元素,但我猜架构允许更多?
此外,我想检索许多元素值 - 有没有一种方法可以声明命名空间一次而不是每个方法调用?
【问题讨论】:
【参考方案1】:你需要使用这个:
SELECT
x.requestpayload.value('declare namespace s="http://blah.ca/api";
(/s:validate-student-request/s:student-id)[1]', 'int')
AS
studentid
FROM
xoutput x
您需要将 XPath 放入 ( ... )
并添加 [1]
以简单地选择该序列的第一个值。
【讨论】:
【参考方案2】:我相信这也可以:
SELECT
x.requestpayload.query('declare namespace s="http://blah.ca/api";
/s:validate-student-request/s:student-id').value('.', 'int')
as studentid
FROM xoutput x
【讨论】:
【参考方案3】:对于那些对性能感兴趣的人,我运行了一个查询来比较这些方法,第一个选项与 "() 并添加 [1]" 比 ".query('strFranchise').value('.', ...)"。
在同一数据上一个接一个地运行时,执行计划的差异为 15% 到 85%。所以 ()[1] 快了 5 倍多!执行计划大不相同。
【讨论】:
据我了解[1]
只返回第一个结果,而.value('.'
返回所有结果。以上是关于XML query() 有效,value() 需要找到单例 xdt:untypedAtomic的主要内容,如果未能解决你的问题,请参考以下文章