MS SQLXML。使用指定的命名空间导入XML

时间:2014-11-27 13:15:33

标签: sql-server xml xsd sqlxml bulk-load

我必须将XML数据导入SQL Server数据库。我有以下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不允许您映射属性&#39; xmlns&#39;,因此sql:mapped='false'在这里不起作用。

问题是,源XML无法更改,甚至可以仅使用XSD架构解决问题吗?

1 个答案:

答案 0 :(得分:0)

使用SQL Server 2005 或更新版本中提供的标准XQuery看起来非常简单:

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

也很容易在INSERT INTO ....语句中使用