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> 元素包含 FirstName 和 LastName 属性。这些属性是 <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 命令提交。