使用 sql:id-prefix 创建有效的 ID、IDREF 和 IDREFS 类型属性(XDR 架构)

重要说明重要提示

本主题是针对早期应用程序提供的参考,以后不会就该功能继续进行开发。请避免在新的开发工作中使用此功能,而应使用带批注的 XSD 架构来创建 XML 视图。有关详细信息,请参阅带批注的 XSD 架构简介 (SQLXML 4.0)。可以将现有带批注的 XDR 架构转换为 XSD 架构。有关详细信息,请参阅将带批注的 XDR 架构转换为等效的 XSD 架构 (SQLXML 4.0)

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

ID、IDREF 和 IDREFS 大体上对应于数据库中的主键/外键 (PK/FK) 关系,它们之间的差别不大。在 XML 文档中,ID 类型属性的值必须是非重复的。如果在 XML 文档中具有 CustomerID 和 SalesOrderID 属性,则这些值必须是非重复的。但是,在数据库中,CustomerID 和 SalesOrderID 列可以具有相同值(例如,CustomerID = 1 和 OrderID = 1 在数据库中是有效的)。

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

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

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

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

  • ID、IDREF 和 IDREFS 类型的属性不能映射到类型为 text、ntext、image 或任何其他二进制数据类型(例如,timestamp)的列。

如果 XML 文档包含多个 ID,则指定 sql:id-prefix 批注以确保值是唯一的。sql:id-prefix 批注还用于从数字创建命名标记。为 sql:id-prefix 指定的值必须是有效的名称字符。

sql:id-prefix属性将字符串置于 ID、IDREF 和 IDREFS 值之前,以使它们是唯一的。不进行检查,以确保前缀的有效性以及 ID、IDREF 或 IDREFS 值的唯一性。

对于类型不是 ID、IDREF 或 IDREFS 的属性,忽略 sql:id-prefix属性。

注意注意

将每个 ID、IDREF 和 IDREFS 属性的值限制为 4,000 个字符以内,包括前缀在内(如果指定)。

示例

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

A. 为 ID 类型属性指定 sql:id-prefix

在此 XDR 架构中,将 SalesOrderID 和 CustomerID 属性声明为 ID 类型。为了确保这些 ID 是唯一和有效的,为这些属性指定 sql:id-prefix 批注:

<?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="Order" sql:relation="Sales.SalesOrderHeader" sql:key-fields="SalesOrderID">
    <AttributeType name="SalesOrderID" dt:type="id" sql:id-prefix="Ord-" />
    <AttributeType name="OrderDate" />
 
    <attribute type="SalesOrderID" />
    <attribute type="OrderDate" />
  </ElementType>

  <ElementType name="Customer" sql:relation="Sales.Customer">
    <AttributeType name="CustomerID" dt:type="id" />
    <attribute type="CustomerID" />
    <AttributeType name="OrderList" dt:type="idrefs"
                                 sql:id-prefix="Ord-" />
    <attribute type="OrderList" sql:relation="Sales.SalesOrderHeader" sql:field="SalesOrderID">
        <sql:relationship
                key-relation="Sales.Customer"
                key="CustomerID"
                foreign-relation="Sales.SalesOrderHeader"
                foreign-key="CustomerID" />
    </attribute>
    <element type="Order">
        <sql:relationship key-relation="Sales.SalesOrderHeader"
                          key="SalesOrderID"
                          foreign-relation="Sales.Customer"
                          foreign-key="SalesOrderID" />
    </element>
  </ElementType>
</Schema>

针对该架构测试示例 XPath 查询

  1. 复制上面的架构代码,并将它粘贴到文本文件中。将该文件另存为 sqlPrefix-Xdr.xml。

  2. 复制以下模板,并将它粘贴到文本文件中。在保存 sqlPrefix-Xdr.xml 的相同目录中将文件另存为 sqlPrefix-XdrT.xml。模板中的 XPath 查询将返回 CustomerID 为 1 的 <Customer> 和 <Order> 子元素。

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

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

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

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

下面是结果集:

<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-01T00:00:00" /> 
    <Order SalesOrderID="Ord-44501" OrderDate="2001-11-01T00:00:00" /> 
    <Order SalesOrderID="Ord-45283" OrderDate="2002-02-01T00:00:00" /> 
    <Order SalesOrderID="Ord-46042" OrderDate="2002-05-01T00:00:00" /> 
  </Customer>
</ROOT>