2014-11-27 4 views
0

Мне нужно импортировать данные XML в базу данных SQL Server. У меня есть следующий XML (например):MS SQLXML. Импорт XML с указанным пространством имен

<ROOT xmlns="http://www.w3.org/1999/xhtml"> 
    <Customer CustomerID="1" CompanyName="xyz" /> 
    <Customer CustomerID="2" CompanyName="abc" /> 
</ROOT> 

С схемой:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns:sql="urn:schemas-microsoft-com:mapping-schema"> 
    <xsd:element name="Customer" sql:relation="Customers" > 
    <xsd:complexType> 
    <xsd:attribute name="CustomerID" type="xsd:string" /> 
    <xsd:attribute name="CompanyName" type="xsd:string" /> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

И работает стандартный MSDN (http://msdn.microsoft.com/ru-ru/library/ms172633.aspx) VBScript SQLXMLBulkLoad преуспеет, однако никаких данных не будут загружены.

Если вы удалите ссылку пространства имен (атрибут xmlns), она будет работать.

XSD не позволяет отображать атрибут 'xmlns', поэтому sql:mapped='false' здесь не работает.

Проблема в том, что исходный XML нельзя изменить, возможно ли решить эту проблему, используя только схему XSD?

ответ

0

Кажется довольно просто со стандартным XQuery, который доступен в SQL Server или более поздней версии:

DECLARE @XmlData XML = '<ROOT xmlns="http://www.w3.org/1999/xhtml"> 
    <Customer CustomerID="1" CompanyName="xyz" /> 
    <Customer CustomerID="2" CompanyName="abc" /> 
</ROOT>' 

;WITH XMLNAMESPACES(DEFAULT 'http://www.w3.org/1999/xhtml') 
SELECT 
    ID = XC.value('@CustomerID', 'int'), 
    CompanyName = XC.value('@CompanyName', 'varchar(50)') 
FROM 
    @XmlData.nodes('/ROOT/Customer') XT(XC) 

дает мне выход:

enter image description here

, которые могут быть легко использованы в a INSERT INTO .... заявление, тоже

+0

Спасибо! Это действительно хороший способ справиться с этой проблемой. Тем не менее, мне все же интересно, можно ли это сделать с помощью SQLXMLBulkLoad и правильной схемы XSD. –

 Смежные вопросы

  • Нет связанных вопросов^_^