XML 大容量加载的指导原则和限制 (SQLXML 4.0)
在使用 XML 大容量加载时,您应该熟悉以下指导原则和限制:
不支持内联架构。
如果在源 XML 文档中具有某一内联架构,则 XML 大容量加载将忽略该架构。 您为 XML 数据外部的 XML 大容量加载指定该映射架构。 不能使用 xmlns=“x:schema” 属性在节点上指定映射架构。
将检查 XML 文档是否格式正确,但不对其进行验证。
XML 大容量加载检查 XML 文档以确定其格式是否正确,即确保 XML 符合万维网联盟的 XML 1.0 建议的语法要求。 如果该文档的格式不正确,则 XML 大容量加载将取消处理并返回错误。 对这一要求的唯一例外是在文档为片断时(例如,在文档没有单个根元素时),在此情况下 XML 大容量加载将加载文档。
XML 大容量加载不针对在 XML 数据文件中定义或引用的任何 XML 数据或 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 字段 注释指定溢出列,则 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 编码注释:
无法在 XML 数据输入中指定某一 URL 后期望大容量加载从该位置读取数据。
创建在映射架构中标识的表(数据库必须存在)。 如果数据库中已存在一个或多个表,SGDropTables 属性将确定是否删除并重新创建这些预先存在的表。
如果指定 SchemaGen 属性(例如 SchemaGen = true),则创建映射架构中标识的表。 但 SchemaGen 不会对这些表创建任何约束(如 PRIMARY KEY/FOREIGN KEY 约束),但有一个例外:如果关系中构成主键的 XML 节点定义为具有 XML 类型的 ID(即, xSD 的 type=“xsd:ID”), 并且 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=true 以及 Keepidentity=false。 当 Keepidentity=false 时,大容量加载需要服务器生成键值。 表应对键具有 IDENTITY 约束。 服务器不会生成重复的密钥,这意味着无需 将 Ignoreeduplicatekey 设置为 true。 仅当将主键值从传入数据上传到具有行的表中时,才应将 Ignoreeduplicatekey 设置为 true ,并且可能存在主键值的冲突。