本主题介绍如何使用 updategram 中指定的映射架构(XSD 或 XDR)来处理更新。 在 updategram 中,可以提供批注映射架构的名称,用于将 updategram 中的元素和属性映射到 Microsoft SQL Server 中的表和列。 在 updategram 中指定映射架构时,updategram 中指定的元素和属性名称必须映射到映射架构中的元素和属性。
若要指定映射架构,请使用mapping-schema同步>元素的属性<。 以下示例显示了两个 updategram:一个使用简单映射架构,一个使用更复杂的架构。
注释
本文档假定你熟悉 SQL Server 中的模板和映射架构支持。 有关详细信息,请参阅带批注的 XSD 架构简介(SQLXML 4.0)。 有关使用 XDR 的旧版应用程序,请参阅带批注的 XDR 架构(SQLXML 4.0 中已弃用)。
处理数据类型
如果架构指定 imagebinaryXML 数据类型或 varbinarySQL Server 数据类型(通过使用sql:datatype),并且未指定 XML 数据类型,则 updategram 假定 XML 数据类型为 binary base 64。 如果数据类型为 bin.base 类型,则必须显式指定类型(dt:type=bin.base 或 type="xsd:hexBinary")。
如果架构指定 dateTime了 XSD date数据类型, time 则还必须通过使用 sql:datatype="dateTime"指定相应的 SQL Server 数据类型。
处理 SQL Server money 类型的参数时,必须在映射架构中的相应节点上显式指定 sql:datatype="money" 。
例子
若要使用以下示例创建工作示例,必须满足 运行 SQLXML 示例的要求中指定的要求。
答: 使用简单的映射架构创建 updategram
以下 XSD 架构(SampleSchema.xml)是将 Customer 元素映射到 <Sales.Customer> 表的映射架构:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:element name="Customer" sql:relation="Sales.Customer" >
<xsd:complexType>
<xsd:attribute name="CustID"
sql:field="CustomerID"
type="xsd:string" />
<xsd:attribute name="RegionID"
sql:field="TerritoryID"
type="xsd:string" />
</xsd:complexType>
</xsd:element>
</xsd:schema>
以下 updategram 将记录插入 Sales.Customer 表中,并依赖于以前的映射架构来正确将此数据映射到该表。 请注意,updategram 使用架构中定义的相同元素名称 <Customer>。 这是强制性的,因为 updategram 指定了特定的架构。
测试 updategram
复制上面的架构代码,并将它粘贴到文本文件中。 将文件另存为 SampleUpdateSchema.xml。
复制下面的 updategram 模板并将其粘贴到文本文件中。 将文件另存为 SampleUpdategram.xml 保存在保存 SampleUpdateSchema.xml的同一目录中。
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram"> <updg:sync mapping-schema="SampleUpdateSchema.xml"> <updg:before> <Customer CustID="1" RegionID="1" /> </updg:before> <updg:after> <Customer CustID="1" RegionID="2" /> </updg:after> </updg:sync> </ROOT>为映射架构(SampleUpdateSchema.xml)指定的目录路径相对于保存模板的目录。 也可以指定绝对路径,例如:
mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"创建并使用 SQLXML 4.0 测试脚本 (Sqlxml4test.vbs) 执行该模板。
有关详细信息,请参阅使用 ADO 执行 SQLXML 4.0 查询。
这是等效的 XDR 架构:
<?xml version="1.0" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
xmlns:dt="urn:schemas-microsoft-com:datatypes"
xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<ElementType name="Customer" sql:relation="Sales.Customer" >
<AttributeType name="CustID" />
<AttributeType name="RegionID" />
<attribute type="CustID" sql:field="CustomerID" />
<attribute type="RegionID" sql:field="TerritoryID" />
</ElementType>
</Schema>
B. 使用映射架构中指定的父子关系插入记录
架构元素可以相关。 <sql:relationship> 元素指定架构元素之间的父子关系。 此信息用于更新具有主键/外键关系的对应表。
以下映射架构(SampleSchema.xml)由两个元素组成: <Order> 和 <OD>:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:annotation>
<xsd:appinfo>
<sql:relationship name="OrderOD"
parent="Sales.SalesOrderHeader"
parent-key="SalesOrderID"
child="Sales.SalesOrderDetail"
child-key="SalesOrderID" />
</xsd:appinfo>
</xsd:annotation>
<xsd:element name="Order" sql:relation="Sales.SalesOrderHeader" >
<xsd:complexType>
<xsd:sequence>
<xsd:element name="OD"
sql:relation="Sales.SalesOrderDetail"
sql:relationship="OrderOD" >
<xsd:complexType>
<xsd:attribute name="SalesOrderID" type="xsd:integer" />
<xsd:attribute name="ProductID" type="xsd:integer" />
<xsd:attribute name="UnitPrice" type="xsd:decimal" />
<xsd:attribute name="OrderQty" type="xsd:integer" />
<xsd:attribute name="UnitPriceDiscount" type="xsd:decimal" />
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="CustomerID" type="xsd:string" />
<xsd:attribute name="SalesOrderID" type="xsd:integer" />
<xsd:attribute name="OrderDate" type="xsd:date" />
</xsd:complexType>
</xsd:element>
</xsd:schema>
以下 updategram 使用此 XSD 架构为订单 43860 添加新订单详细信息记录(<后块中的 OD> 元素)。<> 该 mapping-schema 属性用于在 updategram 中指定映射架构。
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync mapping-schema="SampleUpdateSchema.xml" >
<updg:before>
<Order SalesOrderID="43860" />
</updg:before>
<updg:after>
<Order SalesOrderID="43860" >
<OD ProductID="753" UnitPrice="$10.00"
Quantity="5" Discount="0.0" />
</Order>
</updg:after>
</updg:sync>
</ROOT>
测试 updategram
复制上面的架构代码,并将它粘贴到文本文件中。 将文件另存为 SampleUpdateSchema.xml。
复制上面的 updategram 模板并将其粘贴到文本文件中。 将文件另存为 SampleUpdategram.xml 保存在保存 SampleUpdateSchema.xml的同一目录中。
为映射架构(SampleUpdateSchema.xml)指定的目录路径相对于保存模板的目录。 也可以指定绝对路径,例如:
mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"创建并使用 SQLXML 4.0 测试脚本 (Sqlxml4test.vbs) 执行该模板。
有关详细信息,请参阅使用 ADO 执行 SQLXML 4.0 查询。
这是等效的 XDR 架构:
<?xml version="1.0" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
xmlns:dt="urn:schemas-microsoft-com:datatypes"
xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<ElementType name="OD" sql:relation="Sales.SalesOrderDetail" >
<AttributeType name="SalesOrderID" />
<AttributeType name="ProductID" />
<AttributeType name="UnitPrice" dt:type="fixed.14.4" />
<AttributeType name="OrderQty" />
<AttributeType name="UnitPriceDiscount" />
<attribute type="SalesOrderID" />
<attribute type="ProductID" />
<attribute type="UnitPrice" />
<attribute type="OrderQty" />
<attribute type="UnitPriceDiscount" />
</ElementType>
<ElementType name="Order" sql:relation="Sales.SalesOrderHeader" >
<AttributeType name="CustomerID" />
<AttributeType name="SalesOrderID" />
<AttributeType name="OrderDate" />
<attribute type="CustomerID" />
<attribute type="SalesOrderID" />
<attribute type="OrderDate" />
<element type="OD" >
<sql:relationship
key-relation="Sales.SalesOrderHeader"
key="SalesOrderID"
foreign-key="SalesOrderID"
foreign-relation="Sales.SalesOrderDetail" />
</element>
</ElementType>
</Schema>
C. 使用 XSD 架构中指定的父子关系和反向批注插入记录
此示例说明了 updategram 逻辑如何使用 XSD 中指定的父子关系来处理更新,以及 inverse 如何使用批注。 有关批注的详细信息inverse,请参阅指定 sql:relationship 上的 sql:inverse 属性(SQLXML 4.0)。
此示例假定以下表位于 tempdb 数据库中:
Cust (CustomerID, CompanyName),其中是CustomerID主键Ord (OrderID, CustomerID),其中CustomerID是引用表中主键的CustomerIDCust外键。
updategram 使用以下 XSD 架构将记录插入 Cust 和 Ord 表中:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:annotation>
<xsd:appinfo>
<sql:relationship name="OrdCust" inverse="true"
parent="Ord"
parent-key="CustomerID"
child-key="CustomerID"
child="Cust"/>
</xsd:appinfo>
</xsd:annotation>
<xsd:element name="Order" sql:relation="Ord">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="Customer" sql:relationship="OrdCust"/>
</xsd:sequence>
<xsd:attribute name="OrderID" type="xsd:int"/>
<xsd:attribute name="CustomerID" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="Customer" sql:relation="Cust">
<xsd:complexType>
<xsd:attribute name="CustomerID" type="xsd:string"/>
<xsd:attribute name="CompanyName" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
</xsd:schema>
此示例中的 XSD 架构具有 <Customer> 和 <Order> 元素,并指定两个元素之间的父子关系。 它将 Order 标识为父元素,将 Customer 标识<为子元素。>><
updategram 处理逻辑使用有关父子关系的信息来确定记录插入表中的顺序。 在此示例中,updategram 逻辑首先尝试将记录插入 Ord 表中(因为 <Order> 是父表),然后尝试将记录插入 Cust 表中(因为 <Customer> 是子表)。 但是,由于数据库表架构中包含的主键/外键信息,此插入作会导致数据库中发生外键冲突,并且插入失败。
若要指示 updategram 逻辑在更新作期间反转父子关系,请 inverse 对 <关系> 元素指定批注。 因此,记录首先添加到 Cust 表中,然后在 Ord 表中添加,并且作成功。
以下 updategram 使用指定的 XSD 架构在 Ord 表中插入订单(OrderID=2),并在 Cust 表中插入客户(CustomerID='AAAAA'):
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync mapping-schema="SampleUpdateSchema.xml" >
<updg:before/>
<updg:after>
<Order OrderID="2" CustomerID="AAAAA" >
<Customer CustomerID="AAAAA" CompanyName="AAAAA Company" />
</Order>
</updg:after>
</updg:sync>
</ROOT>
测试 updategram
在 tempdb 数据库中创建这些表:
USE tempdb CREATE TABLE Cust(CustomerID varchar(5) primary key, CompanyName varchar(20)) GO CREATE TABLE Ord (OrderID int primary key, CustomerID varchar(5) references Cust(CustomerID)) GO复制上面的架构代码,并将它粘贴到文本文件中。 将文件另存为 SampleUpdateSchema.xml。
复制上面的 updategram 模板并将其粘贴到文本文件中。 将文件另存为 SampleUpdategram.xml 保存在保存 SampleUpdateSchema.xml的同一目录中。
为映射架构(SampleUpdateSchema.xml)指定的目录路径相对于保存模板的目录。 也可以指定绝对路径,例如:
mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"创建并使用 SQLXML 4.0 测试脚本 (Sqlxml4test.vbs) 执行该模板。
有关详细信息,请参阅使用 ADO 执行 SQLXML 4.0 查询。