XML 大容量加载指南和限制 (SQLXML 4.0)

使用 XML 大容量加载时,应熟悉以下准则和限制:

  • 不支持内联架构。

    如果源 XML 文档中有内联架构,XML 大容量加载将忽略该架构。 为 XML 大容量加载指定 XML 数据外部的映射架构。 不能使用 xmlns=“x:schema” 属性在节点上指定映射架构。

  • 检查 XML 文档是否格式良好,但未验证。

    XML 大容量加载检查 XML 文档以确定其格式是否正确,即确保 XML 符合万维网联盟的 XML 1.0 建议的语法要求。 如果文档格式不正确,XML 大容量加载将取消处理并返回错误。 唯一的例外是当文档是片段(例如,文档没有单个根元素),在这种情况下,XML 大容量加载将加载文档。

    XML 大容量加载不会验证与 XML 数据文件中定义或引用的任何 XML-Data 或 DTD 架构相关的文档。 此外,XML 大容量加载不会根据提供的映射架构验证 XML 数据文件。

  • 将忽略任何 XML prolog 信息。

    XML 大容量加载将忽略 XML 文档中根>元素前后<的所有信息。 例如,XML 大容量加载将忽略任何 XML 声明、内部 DTD 定义、外部 DTD 引用、注释等。

  • 如果你有一个映射架构,用于定义两个表(例如 Customer 和 CustOrder 之间的主键/外键关系),则必须首先在架构中描述具有主键的表。 具有外键列的表必须稍后出现在架构中。 原因是,在架构中标识表的顺序是用于将表加载到数据库中的顺序。例如,在 XML 大容量加载中使用 XDR 架构时,以下 XDR 架构将生成错误,因为 <Order> 元素是在 Customer> 元素之前描述的<。 CustOrder 中的 CustomerID 列是一个外键列,引用 Cust 表中的 CustomerID 主键列。

    <?xml version="1.0" ?>  
    <Schema xmlns="urn:schemas-microsoft-com:xml-data"   
            xmlns:dt="urn:schemas-microsoft-com:xml:datatypes"    
            xmlns:sql="urn:schemas-microsoft-com:xml-sql" >  
    
        <ElementType name="Order" sql:relation="CustOrder" >  
          <AttributeType name="OrderID" />  
          <AttributeType name="CustomerID" />  
          <attribute type="OrderID" />  
          <attribute type="CustomerID" />  
        </ElementType>  
    
       <ElementType name="CustomerID" dt:type="int" />  
       <ElementType name="CompanyName" dt:type="string" />  
       <ElementType name="City" dt:type="string" />  
    
       <ElementType name="root" sql:is-constant="1">  
          <element type="Customers" />  
       </ElementType>  
       <ElementType name="Customers" sql:relation="Cust"   
                         sql:overflow-field="OverflowColumn"  >  
          <element type="CustomerID" sql:field="CustomerID" />  
          <element type="CompanyName" sql:field="CompanyName" />  
          <element type="City" sql:field="City" />  
          <element type="Order" >   
               <sql:relationship  
                   key-relation="Cust"  
                    key="CustomerID"  
                    foreign-key="CustomerID"  
                    foreign-relation="CustOrder" />  
          </element>  
       </ElementType>  
    </Schema>  
    
  • 如果架构未使用 sql:overflow-field 批注指定溢出列,则 XML 大容量加载将忽略 XML 文档中存在但映射架构中未描述的任何数据。

    XML 大容量加载应用在 XML 数据流中遇到已知标记时指定的映射架构。 它忽略 XML 文档中存在但架构中未描述的数据。 例如,假设你有一个描述 Customer> 元素的<映射架构。 XML 数据文件具有包含<所有 Customer 元素的 AllCustomers> 根标记(架构中未描述):><

    <AllCustomers>  
      <Customer>...</Customer>  
      <Customer>...</Customer>  
       ...  
    </AllCustomers>  
    

    在这种情况下,XML 大容量加载将<忽略 AllCustomers> 元素,并开始在 Customer> 元素处<映射。 XML 大容量加载将忽略架构中未描述但存在于 XML 文档中的元素。

    请考虑另一个包含 Order> 元素的< XML 源数据文件。 映射架构中未描述这些元素:

    <AllCustomers>  
      <Customer>...</Customer>  
        <Order> ... </Order>  
        <Order> ... </Order>  
         ...  
      <Customer>...</Customer>  
        <Order> ... </Order>  
        <Order> ... </Order>  
         ...  
      ...  
    </AllCustomers>  
    

    XML 大容量加载将忽略这些 <Order> 元素。 但是,如果使用 sql:overflow-field架构中的批注将列标识为溢出列,XML 大容量加载将存储此列中所有未处理的数据。

  • CDATA 节和实体引用在存储在数据库中之前,将其转换为其字符串等效项。

    在此示例中,CDATA 节包装 City> 元素的值<。 XML 大容量加载在将 City> 元素插入<数据库之前提取字符串值(“NY”)。

    <City><![CDATA[NY]]> </City>  
    

    XML 大容量加载不会保留实体引用。

  • 如果映射架构指定属性的默认值,并且 XML 源数据不包含该属性,则 XML 大容量加载将使用默认值。

    以下示例 XDR 架构将默认值分配给 HireDate 属性:

    <?xml version="1.0" ?>  
    <Schema xmlns="urn:schemas-microsoft-com:xml-data"   
            xmlns:dt="urn:schemas-microsoft-com:xml:datatypes"    
            xmlns:sql="urn:schemas-microsoft-com:xml-sql" >  
       <ElementType name="root" sql:is-constant="1">  
          <element type="Customers" />  
       </ElementType>  
    
       <ElementType name="Customers" sql:relation="Cust3" >  
          <AttributeType name="CustomerID" dt:type="int"  />  
          <AttributeType name="HireDate"  default="2000-01-01" />  
          <AttributeType name="Salary"   />  
    
          <attribute type="CustomerID" sql:field="CustomerID" />  
          <attribute type="HireDate"   sql:field="HireDate"  />  
          <attribute type="Salary"     sql:field="Salary"    />  
       </ElementType>  
    </Schema>  
    

    在此 XML 数据中,第二个 <Customers> 元素中缺少 HireDate 属性。 当 XML 大容量加载将第二个 <Customers> 元素插入数据库时,它将使用架构中指定的默认值。

    <ROOT>  
      <Customers CustomerID="1" HireDate="1999-01-01" Salary="10000" />  
      <Customers CustomerID="2" Salary="10000" />  
    </ROOT>  
    
  • sql:url-encode不支持批注:

    不能在 XML 数据输入中指定 URL,并且希望大容量加载从该位置读取数据。

    将创建映射架构中标识的表(数据库必须存在)。 如果数据库中已存在一个或多个表,SGDropTables 属性将确定是否删除并重新创建这些预先存在的表。

  • 如果指定 SchemaGen 属性(例如 SchemaGen = true),则创建映射架构中标识的表。 但是 SchemaGen 不会对这些表创建任何约束(如 PRIMARY KEY/FOREIGN KEY 约束),但有一个例外:如果关系中构成主键的 XML 节点定义为具有 XML 类型的 ID(即 type="xsd:ID" XSD),并且 SGUseID 属性设置为 True for SchemaGen, 然后,不仅从 ID 类型化节点创建主键,而且从映射架构关系创建主键/外键关系。

  • SchemaGen 不使用 XSD 架构方面和扩展来生成关系 SQL Server 架构。

  • 如果在大容量加载上指定 SchemaGen 属性(例如 SchemaGen = true),则只会更新指定的表(而不是共享名称视图)。

  • SchemaGen 仅提供从带批注的 XSD 生成关系架构的基本功能。 如果需要,用户应手动修改生成的表。

  • 如果表之间存在多于关系,SchemaGen 将尝试创建一个关系,其中包含两个表之间涉及的所有键。 此限制可能是导致 Transact-SQL 错误的原因。

  • 将 XML 数据大容量加载到数据库中时,映射架构中必须至少有一个属性或子元素映射到数据库列。

  • 如果使用 XML 大容量加载插入日期值,则必须以 (-)CCYY-MM-DD(+-)TZ 格式指定值。 这是日期的标准 XSD 格式。

  • 某些属性标志与其他属性标志不兼容。 例如,大容量加载不支持 Ignoreduplicatekeys=trueKeepidentity=false. 当 Keepidentity=false,大容量加载需要服务器生成密钥值。 表应对键具有 IDENTITY 约束。 服务器不会生成重复的密钥,这意味着无需 Ignoreduplicatekeys 设置为 true 仅当将主键值从传入数据上传到具有行的表中并且可能存在主键值的冲突时,才应设置为 <