Ваш подход с 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()
будет читатьконкретное значение, введенное в соответствии со вторым аргументом.