Как заставить SQL Server XQUERY возвращать что-то отличное от «Нет элемента с именем [Элемент]» - PullRequest
3 голосов
/ 02 марта 2010

Извинения, если на этот вопрос ответили в другом месте. Я продолжаю получать сообщение об ошибке XQuery [Mytable.XMLData.nodes ()]: нет элемента с именем «Answer»

SELECT 
ref.value('/','nvarchar(1000)')
FROM   Mytable CROSS APPLY xmldata.nodes('Answer') R(ref)

-

--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>

Я пробовал несколько разных вариантов получения корневого узла («ответ») или любого из дочерних узлов. если, однако, я изменил свое утверждение, чтобы читать

SELECT 
ref.value('/','nvarchar(1000)')
FROM   Mytable CROSS APPLY xmldata.nodes('/') R(ref)

я получаю результат 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)

Спасибо за вашу помощь

1 Ответ

4 голосов
/ 02 марта 2010

Вы не обращаете внимания на пространство имен XML в игре:

<Answer xmlns="http://TempNameSpace.com/AnswerData.xsd" Type="Deliverable" 
        **********************************************

Вы должны принять это во внимание при запросе - сделайте что-то вроде этого:

;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)

Вам нужно сослаться на все внутри <Answer> с префиксом ns: пространства имен XML.

...