【问题标题】:MS SQLXML. Import XML with specified namespace微软 SQLXML。导入指定命名空间的 XML
【发布时间】:2014-11-27 13:15:33
【问题描述】:

我必须将 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 不允许您映射属性“xmlns”,因此sql:mapped='false' 在这里不起作用。

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

【问题讨论】:

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


    【解决方案1】:

    使用 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)
    

    给我一​​个输出:

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

    【讨论】:

    • 谢谢!这实际上是解决问题的好方法。但是,我仍然很好奇它是否可以使用 SQLXMLBulkLoad 和适当的 XSD 架构来完成。
    猜你喜欢
    • 2021-01-12
    • 2021-10-03
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    相关资源
    最近更新 更多