使用 sql:relation(XDR 架构)
重要提示 |
---|
本主题是针对早期应用程序提供的参考。以后不会就该功能继续进行开发。请避免在新的开发工作中使用此功能。请改用带批注的 XSD 架构创建 XML 视图。有关详细信息,请参阅带批注的 XSD 架构简介 (SQLXML 4.0)。可以将现有带批注的 XDR 架构转换为 XSD 架构。有关详细信息,请参阅将带批注的 XDR 架构转换为等效的 XSD 架构 (SQLXML 4.0)。 |
添加 sql:relation 批注,以便将 XDR 架构中的 XML 节点映射为数据库表。将表/视图名称指定为 sql:relation 批注的值。
sql:relation 批注可以添加到 XDR 架构中的 <ElementType>、<element> 或 <attribute> 节点。sql:relation 指定该架构中的 <ElementType>、<element> 或 <attribute> 和数据库中的表/视图之间的映射。
当针对 <ElementType> 指定 sql:relation 时,此批注的范围适用于该 <ElementType> 中的所有属性和子元素规范。因此,它提供了一种编写批注的快捷方式。当针对 <element> 直接指定 sql:relation 时,还针对 <ElementType> 内指定的属性引入了范围。对于 <AttributeType>,将忽略 sql:relation。
当标识符在 Microsoft SQL Server 中有效但在 XML 中无效时,sql:relation 批注非常有用。例如,“Order Details”是 SQL Server 中的有效表名,但该名称在 XML 无效。在这种情况下,可以使用 sql:relation 批注指定映射,例如:
<ElementType name="OD" sql:relation="[Order Details]">
示例
若要创建使用以下示例的工作示例,必须满足一些要求。有关详细信息,请参阅运行 SQLXML 示例的要求。
A. 针对包含属性的 <ElementType> 指定 sql:relation
在本示例中,此 XDR 架构包含的 <Contacts> 元素具有 ContactID、FirstName 和 LastName 属性。针对 <ElementType> 指定 sql:relation 批注,并将 <Contacts> 元素映射为 Person.Contact 表。此映射的范围适用于 <ElementType> 中的所有属性。因此,所有属性均映射为 Person.Contact 表中的列。
为属性执行默认映射;例如,属性映射为 Person.Contact 表中具有相同名称的列。
<?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="Contacts" sql:relation="Person.Contact" >
<AttributeType name="ContactID" />
<AttributeType name="FirstName" />
<AttributeType name="LastName" />
<attribute type="ContactID" />
<attribute type="FirstName" />
<attribute type="LastName" />
</ElementType>
</Schema>
针对该架构测试示例 XPath 查询
复制上面的架构代码,并将它粘贴到文本文件中。将文件另存为 sqlRelationXdr.xml。
复制以下模板,并将它粘贴到文本文件中。在您保存 sqlRelationXdr.xml 的相同目录中将文件另存为 sqlRelationXdrT.xml。模板中的查询选择 ContactID 为 1 的联系人。
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="sqlRelationXdr.xml"> /Contacts[@ContactID="1"] </sql:xpath-query> </ROOT>
为映射架构指定的目录路径是与模板保存位置关联的目录的相对路径。也可以指定绝对路径,例如:
mapping-schema="C:\MyDir\sqlRelationXdr.xml"
创建并使用 SQLXML 4.0 测试脚本 (Sqlxml4test.vbs) 执行该模板。
有关详细信息,请参阅使用 ADO 执行 SQLXML 4.0 查询。
下面是部分结果集:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Contacts ContactID="1" FirstName="Gustavo"
LastName="Achong" />
</ROOT>
B. 针对包含子元素和属性的 <ElementType> 指定 sql:relation
在本示例中,此 XDR 架构包含的 <Contacts> 元素具有 ContactID 属性、<FirstName> 和 <LastName> 子元素。针对 <ElementType> 指定 sql:relation 批注,并将 <Contacts> 元素映射为 Person.Contact 表。此映射的范围适用于 <ElementType> 中的所有属性。因此,所有属性均映射为 Person.Contact 表中的列。
为属性执行默认映射。属性映射为 Person.Contact 表中具有相同名称的列。
在本示例中,针对 <FirstName> 和 <LastName> 子元素指定 content 属性。如果没有 content=textOnly 属性,子元素将不会分别映射为 Person.Contact 表中的 FirstName 和 LastName 列,这是因为在默认情况下,元素映射为表,而不是字段。
<?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="FirstName" content="textOnly"/>
<ElementType name="LastName" content="textOnly"/>
<ElementType name="Contacts" sql:relation="Person.Contact" >
<AttributeType name="ContactID" />
<attribute type="ContactID" />
<element type="FirstName" />
<element type="LastName" />
</ElementType>
</Schema>
此外,还可以在 element 定义中指定 sql:field 批注(而不是指定 content=textOnly 属性),以便将子元素(FirstName 和 LastName)映射为相应的列名称,如以下备用示例:
<element type="FirstName" sql:field="FirstName" />
<element type="LastName" sql:field="LastName" />
针对该架构测试示例 XPath 查询
复制上面的架构代码,并将它粘贴到文本文件中。将文件另存为 UsingSqlRelationXdr.xml。
复制以下模板,并将它粘贴到文本文件中。在您保存 UsingSqlRelationXdr.xml 的相同目录中将文件另存为 UsingSqlRelationXdrT.xml。模板中的查询选择 ContactID 为 1 的联系人。
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="UsingSqlRelationXdr.xml"> /Contacts[@ContactID="1"] </sql:xpath-query> </ROOT>
为映射架构 (UsingSqlRelationXdr.xml) 指定的目录路径是相对于模板保存目录的相对路径。也可以指定绝对路径,例如:
mapping-schema="C:\MyDir\UsingSqlRelationXdr.xml"
创建并使用 SQLXML 4.0 测试脚本 (Sqlxml4test.vbs) 执行该模板。
有关详细信息,请参阅使用 ADO 执行 SQLXML 4.0 查询。
下面是部分结果集:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Contacts ContactID="1">
<FirstName>Gustavo</FirstName>
<LastName>Achong</LastName>
</Contacts>
</ROOT>