可以使用 updategram 或 OPENXML Transact-SQL 函数修改 SQL Server 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 中的关键字(如<同步>、<前后><>)存在于命名空间中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>
以下定义描述了每个块的角色:
<以前>
标识记录实例的现有状态(也称为“前状态”。
<后>
标识要向其更改数据的新状态。
<同步>
包含块<前后><>。
<同步>块可以包含多个块前后<>>集<。 如果块前后>有多个集<,则必须将这些块(即使它们为空)指定为对。<> 此外,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 执行复杂的更新(例如,根据映射架构中指定的父子关系在多个表中插入记录),则必须使用 mapping-schema 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 命令提交。