Updategram 简介 (SQLXML 4.0)

适用于:SQL Server (所有受支持的版本) Azure 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 是删除、插入还是更新记录实例取决于块前后<>>的内容<

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

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

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

在 Updategram 中指定映射架构

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

隐式(默认)映射

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

以下 updategram 演示隐式映射。 在此示例中,updategram 在 Sales.Customer 表中插入一个新客户。 由于此更新报使用隐式映射, <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 对其执行的 映射架构 属性显式提供映射架构。

由于 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)