使用 sql:prefix 创建有效的 ID、IDREF 和 IDREFS 类型属性 (SQLXML 4.0)

适用于:SQL Server Azure SQL 数据库

可以将属性指定为 ID 类型属性。 然后,可以用指定为 IDREF 或 IDREFS 的属性引用 ID 类型属性,从而启用文档之间的链接。

ID、IDREF 和 IDREFS 大体上对应于数据库中的 PK/FK(主键/外键)关系。 在 XML 文档中,ID 类型特性的值必须不同。 如果在 XML 文档中将 CustomerIDOrderID 属性指定为 ID 类型,则这些值必须不同。 但是,在数据库中,CustomerID 和 OrderID 列可以具有相同值。 (例如,CustomerID = 1 和 OrderID = 1 在数据库中都是有效的)。

若要使 ID、IDREF 和 IDREFS 属性有效:

  • ID 的值必须在 XML 文档内是唯一的。

  • 对于每个 IDREF 和 IDREFS,被引用的 ID 值必须在 XML 文档中。

  • ID、IDREF 和 IDREFS 的值必须是命名标记。 (例如,整数值 101 不能是 ID 值。)

  • ID、IDREF 和 IDREFS 类型的属性不能映射到类型文本、ntext图像或任何其他二进制数据类型(例如时间戳)的列。

如果 XML 文档包含多个 ID,请使用 sql:prefix 注释来确保值是唯一的。

请注意, sql:prefix 批注不能与 XSD 固定属性一起使用。

示例

若要创建使用以下示例的工作示例,必须满足某些要求。 有关详细信息,请参阅 运行 SQLXML 示例的要求。

A. 指定 ID 和 IDREFS 类型

在以下架构中,Customer> 元素由 Order> 子元素组成<。< <Order> 元素还具有子元素 OrderDetail <> 元素。

Customer >的< OrderIDList 属性是引用 Order 元素的 OrderID> 属性的< IDREFS 类型属性。

<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="CustOrders"  
                 parent="Sales.Customer"  
                 parent-key="CustomerID"  
                 child="Sales.SalesOrderHeader"  
                 child-key="CustomerID" />  
    <sql:relationship name="OrderOrderDetail"  
                 parent="Sales.SalesOrderHeader"  
                 parent-key="SalesOrderID"  
                 child="Sales.SalesOrderDetail"  
                 child-key="SalesOrderID" />  
  </xsd:appinfo>  
</xsd:annotation>  
  <xsd:element name="Customer" sql:relation="Sales.Customer" >  
   <xsd:complexType>  
     <xsd:sequence>  
        <xsd:element name="Order" sql:relation="Sales.SalesOrderHeader"    
               sql:relationship="CustOrders" maxOccurs="unbounded" >  
          <xsd:complexType>  
              <xsd:sequence>  
                <xsd:element name="OrderDetail"   
                             sql:relation="Sales.SalesOrderDetail"   
                   sql:relationship="OrderOrderDetail"   
                   maxOccurs="unbounded" >  
                  <xsd:complexType>  
                   <xsd:attribute name="SalesOrderID" type="xsd:integer" />  
                   <xsd:attribute name="ProductID" type="xsd:string" />  
                   <xsd:attribute name="OrderQty" type="xsd:integer" />  
                  </xsd:complexType>  
               </xsd:element>  
             </xsd:sequence>  
             <xsd:attribute name="SalesOrderID"   
                            type="xsd:ID" sql:prefix="ord-" />  
             <xsd:attribute name="OrderDate" type="xsd:date" />  
             <xsd:attribute name="CustomerID" type="xsd:string" />  
          </xsd:complexType>  
      </xsd:element>  
    </xsd:sequence>  
    <xsd:attribute name="CustomerID" type="xsd:string" />  
    <xsd:attribute name="OrderIDList" type="xsd:IDREFS"   
                   sql:relation="Sales.SalesOrderHeader" sql:field="SalesOrderID"  
                   sql:relationship="CustOrders" sql:prefix="ord-">  
    </xsd:attribute>  
  </xsd:complexType>  
</xsd:element>  
</xsd:schema>  
针对架构测试示例 XPath 查询
  1. 复制上面的架构代码,并将它粘贴到文本文件中。 将该文件另存为 sqlPrefix.xml。

  2. 复制以下模板,并将它粘贴到文本文件中。 在保存 sqlPrefix.xml 的相同目录中将该文件另存为 sqlPrefixT.xml。

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
      <sql:xpath-query mapping-schema="sqlPrefix.xml">  
        /Customer[@CustomerID=1]  
      </sql:xpath-query>  
    </ROOT>  
    

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

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

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

下面是部分结果:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <Customer CustomerID="1" OrderIDList="ord-43860 ord-44501 ord-45283 ord-46042">  
    <Order SalesOrderID="ord-43860" OrderDate="2001-08-01" CustomerID="1">  
      <OrderDetail SalesOrderID="43860" ProductID="729" OrderQty="1" />   
      <OrderDetail SalesOrderID="43860" ProductID="732" OrderQty="1" />   
      <OrderDetail SalesOrderID="43860" ProductID="738" OrderQty="1" />   
      <OrderDetail SalesOrderID="43860" ProductID="753" OrderQty="2" />   
      ...  
    </Order>  
    ...  
 </Customer>  
</ROOT>