使用 sql:field(XDR 架构)

重要说明重要提示

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

sql:field 批注指定带批注的架构中的元素或属性与数据库中的列之间的映射,并且可以添加到元素或属性中。在带批注的架构的 <AttributeType> 元素上忽略 sql:field 批注。sql:field 属性指定表或视图中的映射列的名称。

例如,在列名与用 XDR 指定的架构中的字段不匹配时,可以使用 sql:field 指定该列名。sql:field 的值必须是列名。不允许使用由四个部分组成的列名,如 database.owner.table.columnname。这适用于将列名作为值的所有批注。

示例

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

A. 为 XDR 架构的某个 <attribute> 指定 sql:field

在这个带批注的架构中,对架构的 <attribute> 元素指定 sql:field 批注。sql:field 属性将架构中的 Email 属性映射到 Person.Contact 表中的 EmailAddress 列。

由于 XDR 架构中的属性名称 ContactID 与 Person.Contact 表中的 ContactID 列同名,所以未指定 sql:field。默认情况下执行映射。

<?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="Email" />
    <attribute type="ContactID" />
    <attribute type="Email" sql:field="EmailAddress" />
</ElementType>
</Schema>

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

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

  2. 复制以下模板,并将它粘贴到文本文件中。在保存 sqlFieldXdr.xml 的目录中将该文件另存为 sqlFieldXdrT.xml。模板中的查询选择 ContactID 为 1 的客户。

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

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

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

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

下面是部分结果集:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> 
  <Contacts ContactID="1" Email="gustavo0@adventure-works.com" /> 
</ROOT>

在映射架构中,可以全局声明属性(例如 <AttributeType...>,在 <ElementType> 的范围之外声明),然后在 <attribute type=...> 中引用这些属性,如此架构所示。

在此架构中,对 LastName 属性进行了全局声明,然后在客户 <ElementType> 的范围内引用该属性。

<?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">
<AttributeType name="LastName" />
<ElementType name="Contacts" sql:relation="Person.Contact" >
    <AttributeType name="ContactID" />
    <AttributeType name="FName" />
    <AttributeType name="LName" />
    
    <attribute type="CustomerID" />
    <attribute type="FName" sql:field="FirstName" />
    <attribute type="LName" sql:field="LastName" />
</ElementType>
</Schema>

B. 为 XDR 架构中的 <element> 指定 sql:field

在这个带批注的架构中,针对架构的 <element> 元素指定 sql:field 批注。sql:field 批注将架构中的 <Email> 子元素映射到 Person.Contact 表中的 EmailAddress 列。

若无显式批注,架构中的 <Contacts> 元素的 <Email> 子元素不会映射到 Person.Contact 表的 EmailAddress 列,因为默认的元素映射指向关系而不是字段(当 <ElementType> 包含 textOnly 属性时例外)。

<?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="Email" />
  <ElementType name="Contacts" sql:relation="Person.Contact" >
    <AttributeType name="ContactID" />

    <attribute type="ContactID" />
    <element type="Email" sql:field="EmailAddress" />
  </ElementType>
</Schema>

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

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

  2. 复制以下模板,并将它粘贴到文本文件中。在保存 sqlFieldElementXdr.xml 的目录中将该文件另存为 sqlFieldElementXdrT.xml。模板中的查询选择 ContactID 为 1 的客户。

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

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

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

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

下面是部分结果集:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> 
  <Contacts ContactID="1"> 
    <Email>gustavo0@adventure-works.com</Email> 
  </Contacts> 
</ROOT>

如果对电子邮件地址 <ElementType> 指定了 content="textOnly",且使用 SQL 列的默认名称 ("EmailAddress"),则子元素无需 sql:field 批注。在此情况下,<EmailAddress> 子元素将映射到 Person.Contact 表中的 EmailAddress 列。

<?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="EmailAddress" content="textOnly" />
  <ElementType name="Contacts" sql:relation="Person.Contact" >
    <AttributeType name="ContactID" />

    <attribute type="ContactID" />
    <element type="EmailAddress" />
  </ElementType>
</Schema>