Updategram 简介 (SQLXML 4.0)

适用于:SQL ServerAzure SQL 数据库

可以使用 updategram 或 OPENXML Transact-SQL 函数修改 (在 Microsoft SQL Server 中的数据库中插入、更新) 或删除数据库。

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

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

注意

本文档假定你熟悉 SQL Server 中的模板和映射架构支持。 有关详细信息,请参阅 SQLXML 4.0) (批注 XSD 架构简介 。 对于使用 XDR 的旧版应用程序,请参阅 SQLXML 4.0) 中已弃用的批注 XDR 架构 (

Updategram 中必需的命名空间

updategram 中的关键字(例如<同步><位于><>urn:schemas-microsoft-com:xml-updategram 命名空间中。 您可以为该命名空间使用任意前缀。 在此文档中, updg 前缀表示 updategram 命名空间。

查看语法

updategram 是一个模板,<其中包含构成 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>  

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

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

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

<sync>
包含之前<><之后>的块。 同步<>块可以包含多个前后<>块集<。> 如果之前>和之后的块有多个集<,则这些块 (即使它们是空的,) 必须指定为对。>< 此外,updategram 可以有多个 <同步> 块。 每个<同步>块都是事务 (一个单元,这意味着同步>块中<的所有内容都已完成,或者) 未执行任何操作。 如果在 updategram 中指定多个 <同步> 块,则一个 <同步> 块的失败不会影响其他 <同步> 块。

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

  • 如果记录实例仅出现在 before> 块中<,且后>块中<没有相应的实例,则 updategram 将执行删除操作。

  • 如果记录实例仅出现在 after> 块中<,且前>一个块中<没有相应的实例,则它是插入操作。

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

在 Updategram 中指定映射架构

在 updategram 中,映射架构(支持 XSD 和 XDR 架构)所提供的 XML 抽象可以是隐式的,也可以是显式的(即无论是否指定映射架构,updategram 都可以工作)。 如果未指定映射架构,则 updategram 假定隐式映射 (默认映射) ,其中块之前>或块之后的每个元素<映射到表,并且每个元素的子元素或属性映射到数据库中的列。>< 如果显式指定映射架构,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 未指定映射架构,因此 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 命令提交。

另请参阅

updategram 的安全注意事项 (SQLXML 4.0)