使用 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 查询
复制上面的架构代码,并将它粘贴到文本文件中。将该文件另存为 sqlPrefix-Xdr.xml。
复制以下模板,并将它粘贴到文本文件中。在保存 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"
创建并使用 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>