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 之间)的主键/外键关系的映射架构,则必须在该架构中首先描述具有主键的表。 具有外键列的表必须出现在该架构中的后面。 这样做的原因是,在架构中标识表的顺序是用于将它们加载到数据库中的顺序。例如,以下 XDR 架构在 XML 大容量加载中使用时将生成错误,因为 <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 数据文件具有 <AllCustomers> 根标记 (未在包含所有 <Customer> 元素的架构) 中介绍:
<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 节点被定义为具有 ID (即,XSD) 的 type=“xsd:ID” ,并且 SchemaGen 的 SGUseID 属性设置为 True, 不仅从 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 约束。 服务器不会生成重复密钥,这意味着不需要将 Ignoreduplicatekeys 设置为 true。 仅当将传入数据中的主键值上传到包含行且主键值可能存在冲突的表中时,Ignoreduplicatekeys 才应设置为 true。
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈