Updategram 简介 (SQLXML 4.0)
可以使用 updategram 或 OPENXML Transact-SQL 函数从现有 XML 文档修改Microsoft SQL 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 是一个模板,其中包含<同步>、<之前>和<之后>的块,这些模板构成了 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> 元素由 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 中的表名 [订单详细信息] 在 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 命令提交。