Проблема извлечения XML с помощью xmlns - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть некоторый стандартный XML-код, который я пытаюсь извлечь, я прочитал множество различных вопросов, касающихся xmlns, и мой код до этого момента, но мне кажется, что я не могу извлечь из него текствнутри "" для CustomerID -

DECLARE @docHandle INT 
DECLARE @XmlDocument NVARCHAR(1000) 
DECLARE @rootxmlns VARCHAR(1000) 

SET @XmlDocument ='  
<Root xmlns="http://www.adventure-works.com">   
 <Customers>     
  <Customer CustomerID="GREAL">       
   <CompanyName>Great Lakes Food Market</CompanyName>       
   <ContactName>Howard Snyder</ContactName>       
   <ContactTitle>Marketing Manager</ContactTitle>
   <Phone>(503) 555-7555</Phone>       
  </Customer>     
 </Customers>  
</Root>  ' 
SET @rootxmlns = '<Root xmlns:hm="http://www.adventure-works.com"/>' 

-- Create an internal representation of the XML document.   
EXEC Sp_xml_preparedocument 
@docHandle output, 
@XmlDocument, 
@rootxmlns 

-- Execute a SELECT statement using OPENXML rowset provider.   
SELECT * 
FROM   OPENXML (@docHandle, '/hm:Root/hm:Customers', 3) 
      WITH ([CustomerID]           CHAR(10) './hm:CustomerID'
           ,[Customer.CompanyName] VARCHAR(100)'hm:Customer/hm:CompanyName' 
           ,[Customer.ContactName] VARCHAR(100) 
   'hm:Customer/hm:ContactName' ) 

EXEC Sp_xml_removedocument 
@docHandle 

1 Ответ

0 голосов
/ 10 декабря 2018

Ваш подход с FROM OPENXML вместе с хранимыми процедурами для создания и удаления XML-документа устарел и больше не должен использоваться.Гораздо лучше, быстрее и проще для чтения являются нативные методы XML (некоторые из них поддерживаются начиная с v2005).

Я помещаю ваш XML в переменную, объявленную изначально.Но вы можете inline этот подход в любом запросе к табличным данным, который позволяет использовать XML в VIEWs и iTVF.

DECLARE @XmlDocument XML;

SET @XmlDocument ='  
<Root xmlns="http://www.adventure-works.com">   
 <Customers>     
  <Customer CustomerID="GREAL">       
   <CompanyName>Great Lakes Food Market</CompanyName>       
   <ContactName>Howard Snyder</ContactName>       
   <ContactTitle>Marketing Manager</ContactTitle>
   <Phone>(503) 555-7555</Phone>       
  </Customer>     
 </Customers>  
</Root>';

- Прежде всего мы объявляем пространство имен по умолчанию (xmlns="Some URI")

WITH XMLNAMESPACES(DEFAULT 'http://www.adventure-works.com') 
SELECT c.value('(Customer/@CustomerID)[1]','nvarchar(max)') AS CustomerID
      ,c.value('(Customer/CompanyName/text())[1]','nvarchar(max)') AS CompanyName
      ,c.value('(Customer/ContactName/text())[1]','nvarchar(max)') AS ContactName
      ,c.value('(Customer/ContactTitle/text())[1]','nvarchar(max)') AS ContactTitle
      ,c.value('(Customer/Phone/text())[1]','nvarchar(max)') AS Phone
FROM @XmlDocument.nodes('/Root/Customers') A(c)

Из множественного числа <Customers> Я предполагаю, что в одном XML может быть несколько клиентов.Вот почему я использую .nodes(), чтобы получить производную таблицу со всеми клиентами (будет возвращено как по строкам для каждого клиента).

Метод .value() будет читатьконкретное значение, введенное в соответствии со вторым аргументом.

...