Updategram 简介 (SQLXML 4.0)

通过使用 updategram 或 OPENXML Transact-SQL 函数,可以从现有 XML 文档在 MicrosoftSQL Server 中修改(插入、更新或删除)数据库。

OPENXML 函数通过拆分现有 XML 文档并提供可以传递给 INSERT、UPDATE 或 DELETE 语句的行集来修改数据库。使用 OPENXML 时,直接针对数据库表进行操作。因此,在行集提供程序(如表)可以显示为源时,最适合使用 OPENXML。

与 OPENXML 一样,updategram 允许您在数据库中插入、更新或删除数据;不过,updategram 针对带批注的 XSD(或 XDR)架构提供的 XML 视图进行操作,例如将更新应用于映射架构提供的 XML 视图。而映射架构则具有将 XML 元素和属性映射到相应的数据库表和列所需的信息。updategram 使用此映射信息更新数据库表和列。

注意注意

本文档假定您熟悉 SQL Server 中的模板和映射架构支持。有关详细信息,请参阅 带批注的 XSD 架构简介 (SQLXML 4.0)。有关使用 XDR 的早期应用程序,请参阅带批注的 XDR 架构(在 SQLXML 4.0 中不推荐使用)

Updategram 中必需的命名空间

updategram 中的关键字(如 <sync>、<before> 和 <after>)存在于 urn:schemas-microsoft-com:xml-updategram 命名空间中。您可以为该命名空间使用任意前缀。在本文档中,用 updg 前缀指示 updategram 命名空间。

检查语法

updategram 是具有 <sync>、<before> 和 <after> 块的模板,这些块构成了 updategram 的语法。以下代码显示了此语法的最简单形式:

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
  <updg:sync [mapping-schema= "AnnotatedSchemaFile.xml"] >
    <updg:before>
        ...
    </updg:before>
    <updg:after>
        ...
    </updg:after>
  </updg:sync>
</ROOT>

以下定义描述了其中每个块的作用:

  • <before>
    标识记录实例的现有状态(也称为“以前状态”)。

  • <after>
    标识要将数据更改到的新状态。

  • <sync>
    包含 <before> 和 <after> 块。<sync> 块可以包含多组 <before> 和 <after> 块。如果存在多组 <before> 和 <after> 块,则必须成对指定这些块(即使它们为空)。此外,一个 updategram 可以具有多个 <sync> 块。每个 <sync> 块都是一个事务单元(这意味着 <sync> 块中的所有事情都已完成或未完成任何事情)。如果在 updategram 中指定多个 <sync> 块,其中一个 <sync> 块失败将不会影响其他 <sync> 块。

updategram 是删除、插入还是更新记录实例取决于 <before> 和 <after> 块的内容:

  • 如果记录实例只出现在 <before> 块中,而在 <after> 块中没有对应的实例,则 updategram 将执行删除操作。

  • 如果记录实例只出现在 <after> 块中,而在 <before> 块中没有对应的实例,则 updategram 将执行插入操作。

  • 如果记录实例出现在 <before> 块中,并在 <after> 块中存在对应的实例,则执行更新操作。在这种情况下,updategram 将记录实例更新为在 <after> 块中指定的值。

在 Updategram 中指定映射架构

在 updategram 中,映射架构(支持 XSD 和 XDR 架构)所提供的 XML 抽象可以是隐式的,也可以是显式的(即无论是否指定映射架构,updategram 都可以工作)。如果未指定映射架构,updategram 采用隐式映射(默认映射),此时将 <before> 块或 <after> 块中的每个元素映射到表,将每个元素的子元素或属性映射到数据库中的列。如果显式指定映射架构,updategram 中的元素和属性必须与映射架构中的元素和属性匹配。

隐式(默认)映射

在大多数情况下,执行简单更新的 updategram 可能不需要映射架构。此时 updategram 依赖于默认映射架构。

以下 updategram 演示隐式映射。在此示例中,updategram 在 Sales.Customer 表中插入一个新客户。由于此 updategram 使用隐式映射,因此将 <Sales.Customer> 元素映射到 Sales.Customer 表,将 CustomerID 和 SalesPersonID 属性映射到 Sales.Customer 表中相应的列。

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync >
<updg:before>
</updg:before>
<updg:after>
    <Sales.Customer CustomerID="1" SalesPersonID="277" />
    </updg:after>
</updg:sync>
</ROOT>

显式映射

如果指定映射架构(XSD 或 XDR),则 updategram 使用该架构确定要更新的数据库表和列。

如果 updategram 执行复杂更新(例如根据在映射架构中指定的父-子关系在多个表中插入记录),必须通过使用要针对其执行 updategram 的 mapping-schema 属性明确提供映射架构。

由于 updategram 是模板,因此为 updategram 中的映射架构指定的路径是相对于模板文件的位置而言(即相对于存储 updategram 的位置而言)。有关详细信息,请参阅在 updategram 中指定带批注的映射架构 (SQLXML 4.0)

Updategram 中以元素为中心的映射和以属性为中心的映射

使用默认映射(在 updategram 中未指定映射架构)时,如果是以元素为中心的映射,则 updategram 元素映射到表并且子元素映射到列。如果是以属性为中心的映射,则属性映射到列。

以元素为中心的映射

在以元素为中心的 updategram 中,元素包含指示元素属性的子元素。请参阅以下 updategram 示例。<Person.Contact> 元素包含 <FirstName><LastName> 子元素。这些子元素是 <Person.Contact> 元素的属性。

由于此 updategram 未指定映射架构,它将使用隐式映射,将 <Person.Contact> 元素映射到 Person.Contact 表,将其子元素映射到 FirstName 和 LastName 列。

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync >
  <updg:after>
    <Person.Contact>
       <FirstName>Catherine</FirstName>
       <LastName>Abel</LastName>
    </Person.Contact>
  </updg:after>
</updg:sync>
</ROOT>

以属性为中心的映射

在以属性为中心的映射中,元素具有属性。以下 updategram 使用以属性为中心的映射。在此示例中,<Person.Contact> 元素包含 FirstNameLastName 属性。这些属性是 <Person.Contact> 元素的特性。与上一示例一样,此 updategram 未指定映射架构,因此它依赖于隐式映射将 <Person.Contact> 元素映射到 Person.Contact 表并将该元素的属性映射到表中相应的列。

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync >
  <updg:before>
  </updg:before>
  <updg:after>
    <Person.Contact FirstName="Catherine" LastName="Abel" />
  </updg:after>
</updg:sync>
</ROOT>

同时使用以元素为中心的映射和以属性为中心的映射

可以组合使用以元素为中心的映射和以属性为中心的映射,如以下 updategram 中所示。请注意 <Person.Contact> 元素同时包含一个属性和一个子元素。此 updategram 也依赖于隐式映射。这样就将 FirstName 属性和 <LastName> 子元素映射到 Person.Contact 表中相应的列。

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync >
  <updg:before>
  </updg:before>
  <updg:after>
    <Person.Contact FirstName="Catherine" >
       <LastName>Abel</LastName>
    </Person.Contact>
  </updg:after>
</updg:sync>
</ROOT>

使用在 SQL Server 中有效但在 XML 中无效的字符

在 SQL Server 中,表名称可以包含空格。但是,此类表名称在 XML 中无效。

若要对那些是有效 SQL Server 标识符但是不是有效 XML 标识符的字符进行编码,请使用“__xHHHH__”作为编码值,其中 HHHH 表示字符对应的四位十六进制 UCS-2 代码,最高有效位排在最前面。使用此编码方案时,用 x0020(空格字符的四位十六进制代码)替换空格字符;这样 SQL Server 中的表名称 [Order Details] 在 XML 中就变为 _x005B_Order_x0020_Details_x005D_。

类似地,您可能需要指定由三个部分组成的元素名称,如 <[database].[owner].[table]>。由于方括号([ 和 ])在 XML 中无效,必须将此名称指定为 <_x005B_database_x005D_._x005B_owner_x005D_._x005B_table_x005D_>,其中 _x005B_ 为左方括号 ([) 的编码,_x005D_ 为右方括号 (]) 的编码。

执行 Updategram

由于 updategram 是模板,因此模板的所有处理机制均适用于 updategram。对于 SQLXML 4.0,可以通过以下方式之一来执行 updategram:

  • 在 ADO 命令中提交它。

  • 将其作为 OLE DB 命令提交。