XML query()有效,value()需要找到单独的xdt:untypedAtomic

OMG*_*ies 32 sql t-sql sql-server xquery sql-server-2005

我有一个存储为文本的类型化的xml文档.因此,我使用公用表表达式将数据类型CONVERT转换为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
Run Code Online (Sandbox Code Playgroud)

查询工作,返回给我元素.但我只对价值感兴趣:

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
Run Code Online (Sandbox Code Playgroud)

这给了我以下错误:

'value()'需要一个单例(或空序列),找到'xdt:untypedAtomic*'类型的操作数

我用google搜索说XPATH/XQUERY需要在括号内和/或需要"[1]" - 两者都没有用.xml中只有一个student-id元素,但我想模式允许更多?

另外,我想要检索的元素值很多 - 有没有办法声明命名空间一次而不是每个方法调用?

mar*_*c_s 66

你需要使用这个:

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
Run Code Online (Sandbox Code Playgroud)

您需要将XPath放入( ... ) 并添加一个[1]以简单地选择该序列的第一个值.


小智 8

我相信这也可能会:

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
Run Code Online (Sandbox Code Playgroud)