如何让 SQL Server XQUERY 返回“没有名为 [Element] 的元素”以外的内容

Bet*_*033 4 sql sql-server xquery sql-server-2008

如果在其他地方回答了这个问题,我们深表歉意。我不断收到错误消息 XQuery [Mytable.XMLData.nodes()]: There is no element named 'Answer'

SELECT 
ref.value('/','nvarchar(1000)')
FROM   Mytable CROSS APPLY xmldata.nodes('Answer') R(ref)
Run Code Online (Sandbox Code Playgroud)

——

--XML of Row
<Answer xmlns="http://TempNameSpace.com/AnswerData.xsd" Type="Deliverable">
  <Deliverable>
    <Title>test</Title>
    <Description>test</Description>
    <DueDate>2010-02-16T08:59:59</DueDate>
  </Deliverable>
</Answer>
Run Code Online (Sandbox Code Playgroud)

我已经尝试了几种不同的变体来获取根节点(“答案”)或任何子节点,如果,但是我将语句更改为

SELECT 
ref.value('/','nvarchar(1000)')
FROM   Mytable CROSS APPLY xmldata.nodes('/') R(ref)
Run Code Online (Sandbox Code Playgroud)

我得到结果 testtest2010-02-16T08:59:59

我最终会喜欢表格格式的数据,比如

SELECT 
    ref.value('/Title','nvarchar(1000)') as Title
    ref.value('/Description','nvarchar(1000)') as Description

etc..
    FROM   Mytable CROSS APPLY xmldata.nodes('/Deliverable') R(ref)
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助

mar*_*c_s 5

您没有注意正在使用的 XML 命名空间:

<Answer xmlns="http://TempNameSpace.com/AnswerData.xsd" Type="Deliverable" 
        **********************************************
Run Code Online (Sandbox Code Playgroud)

您需要在查询时考虑到这一点 - 执行以下操作:

;WITH XMLNAMESPACES('http://TempNameSpace.com/AnswerData.xsd' AS ns)
SELECT 
  ref.value('(ns:*)[1]', 'nvarchar(1000)')
FROM Mytable 
CROSS APPLY xmldata.nodes('/ns:Answer') R(ref)
Run Code Online (Sandbox Code Playgroud)

您需要<Answer>使用ns:XML 命名空间前缀引用内部的所有内容。