在 updategram 中指定带批注的映射架构 (SQLXML 4.0)

适用于:SQL ServerAzure SQL 数据库

本主题说明如何使用在 updategram 中指定的映射架构(XSD 或 XDR)来处理更新。 在 updategram 中,可以提供批注映射架构的名称,用于将 updategram 中的元素和属性映射到 Microsoft SQL Server 中的表和列。 在 updategram 中指定映射架构时,updategram 中指定的元素和属性名称必须映射为该映射架构的元素和属性。

若要指定映射架构,请使用 sync> 元素的<mapping-schema 属性。 以下示例显示两个 updategram:其中一个使用简单映射架构,而另一个使用较复杂的架构。

注意

本文档假定你熟悉 SQL Server 中的模板和映射架构支持。 有关详细信息,请参阅 SQLXML 4.0) (带批注的 XSD 架构简介 。 对于使用 XDR 的旧版应用程序,请参阅在 SQLXML 4.0) 中弃用 (批注的 XDR 架构

处理数据类型

如果架构使用 sql:datatype) 指定 image、binary 或 varbinary SQL Server数据类型 (,并且未指定 XML 数据类型,则 updategram 假定 XML 数据类型为二进制 base 64。 如果数据为 bin.base 类型,则必须显式指定类型 (dt:type=bin.basetype=“xsd:hexBinary”) 。

如果架构指定 dateTimedatetime XSD 数据类型,则还必须使用 sql:datatype=“dateTime”指定相应的SQL Server数据类型。

处理SQL Server money 类型的参数时,必须在映射架构中的相应节点上显式指定 sql:datatype=“money”。

示例

若要使用以下示例创建工作示例,必须满足 运行 SQLXML 示例的要求中指定的要求。

A. 创建采用简单映射架构的 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
  1. 复制上面的架构代码,并将它粘贴到文本文件中。 将文件另存为 SampleUpdateSchema.xml。

  2. 复制下面的 updategram 模板,然后将其粘贴到文本文件中。 在您保存 SampleUpdateSchema.xml 的相同目录中将文件另存为 SampleUpdategram.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"  
    
  3. 创建并使用 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 的 after> 块) 中添加<<个新的订单详细信息记录 (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
  1. 复制上面的架构代码,并将它粘贴到文本文件中。 将文件另存为 SampleUpdateSchema.xml。

  2. 复制上面的 Updategram 模板,并将它粘贴到文本文件中。 在您保存 SampleUpdateSchema.xml 的相同目录中将文件另存为 SampleUpdategram.xml。

    为映射架构 (SampleUpdateSchema.xml) 指定的目录路径是相对于模板保存目录的相对路径。 也可以指定绝对路径,例如:

    mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"  
    
  3. 创建并使用 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 中指定的父子关系来处理更新,以及如何使用 批注。 有关 反向 批注的详细信息,请参阅 指定 sql:relationship 上的 sql:inverse 属性 (SQLXML 4.0)

此示例假定以下表位于 tempdb 数据库中:

  • Cust (CustomerID, CompanyName),其中 CustomerID 为主键。

  • Ord (OrderID, CustomerID),其中 CustomerID 是引用 CustomerID 表中的 Cust 主键的外键。

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 处理逻辑使用父子关系相关信息来确定将记录插入到表中的顺序。 在此示例中,由于 Order> 是父) <,updategram 逻辑首先尝试将记录插入到 Ord 表中 (,然后尝试将记录插入 Cust 表中 (,因为 <Customer> 是子) 。 但是,鉴于数据库表架构中包含的主键/外键信息,此插入操作将导致在数据库中的外键冲突,继而导致插入失败。

若要指示 updategram 逻辑在更新操作期间反转父子关系,请在关系>元素上<指定反向批注。 这会导致首先向 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
  1. 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  
    
  2. 复制上面的架构代码,并将它粘贴到文本文件中。 将文件另存为 SampleUpdateSchema.xml。

  3. 复制上面的 Updategram 模板,并将它粘贴到文本文件中。 在您保存 SampleUpdateSchema.xml 的相同目录中将文件另存为 SampleUpdategram.xml。

    为映射架构 (SampleUpdateSchema.xml) 指定的目录路径是相对于模板保存目录的相对路径。 也可以指定绝对路径,例如:

    mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"  
    
  4. 创建并使用 SQLXML 4.0 测试脚本 (Sqlxml4test.vbs) 执行该模板。

    有关详细信息,请参阅 使用 ADO 执行 SQLXML 4.0 查询

另请参阅

updategram 的安全注意事项 (SQLXML 4.0)