Identificar columnas de claves mediante sql:key-fields (esquema XDR)
Importante |
---|
Este tema se incluye como referencia para las aplicaciones heredadas. No se llevará a cabo ningún trabajo de desarrollo de esta característica en el futuro. Evite utilizarla en nuevos trabajos de desarrollo. En su lugar, use esquemas XSD anotados para crear vistas XML. Para obtener más información, vea Introducción a los esquemas XSD anotados (SQLXML 4.0). Puede convertir los esquemas XDR anotados existentes en esquemas XSD. Para obtener más información, vea Convertir esquemas XDR anotados en esquemas XSD equivalentes (SQLXML 4.0). |
Cuando se especifica una consulta XPath en el esquema XDR, la información de claves resulta necesaria en la mayoría de los casos para obtener un anidamiento correcto en el resultado. Especificar la anotación sql:key-fields es una forma de asegurarse de que se genera la jerarquía correcta.
[!NOTA]
Para generar un anidamiento correcto en el resultado, es recomendable especificar sql:key-fields en todos los esquemas.
En muchas instancias, esta anotación resulta necesaria para entender cómo identificar de forma única las filas de una tabla a fin de generar la jerarquía XML correcta. La anotación sql:key-fields puede agregarse a <element> y <ElementType> para identificar las columnas que identifican de forma única las filas de la tabla.
El valor de sql:key-fields identifica las columnas que identifican de forma única las filas de la relación especificada en <ElementType>. Si se requiere más de una columna para identificar de forma única una fila, los valores de columna se muestran separados por un espacio.
La anotación sql:key-fields debe especificarse en un elemento que contenga un elemento secundario y un elemento <sql:relationship>, definido entre el elemento y el elemento secundario, que no proporciona la clave principal de la tabla especificada en el elemento primario.
Ejemplos
Para crear ejemplos funcionales mediante los ejemplos siguientes, debe cumplir determinados requisitos. Para obtener más información, vea Requisitos para ejecutar los ejemplos de SQLXML.
A. Crear un anidamiento correcto cuando <sql:relationship> no proporciona información suficiente
En este ejemplo se muestra dónde debe especificarse sql:key-fields.
Considere el esquema siguiente. El esquema especifica la jerarquía entre los elementos <Order> y <Customer> donde el elemento <Order> es el elemento primario y el elemento <Customer> es un elemento secundario.
La etiqueta <sql:relationship> se utiliza para especificar la relación de elementos primarios y secundarios. La etiqueta <sql:relationship> identifica CustomerID como foreign-key en la tabla Sales.SalesOrderHeader, y hace referencia a la clave CustomerID en la tabla Sales.Customer. Esta información proporcionada en <sql:relationship> no es suficiente para identificar de forma única las filas de la tabla primaria (Sales.SalesOrderHeader). Por lo tanto, sin sql:key-fields, la jerarquía que se genera es inexacta.
Con la anotación sql:key-fields especificada en <Order>, la anotación identifica de forma única las filas del elemento primario (tabla Sales.SalesOrderHeader) y sus elementos secundarios aparecen debajo de su elemento primario.
Éste es el esquema:
<?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="Customer" sql:relation="Sales.Customer">
<AttributeType name="CustomerID" />
<attribute type="CustomerID" />
</ElementType>
<ElementType name="Order" sql:relation="Sales.SalesOrderHeader"
sql:key-fields="SalesOrderID" >
<AttributeType name="SalesOrderID" />
<AttributeType name="CustomerID" />
<attribute type="SalesOrderID" />
<attribute type="CustomerID" />
<element type="Customer" >
<sql:relationship
key-relation="Sales.SalesOrderHeader"
key="CustomerID"
foreign-relation="Sales.Customer"
foreign-key="CustomerID" />
</element>
</ElementType>
</Schema>
Para probar un ejemplo funcional de este esquema
Copie el código de esquema anterior y péguelo en un archivo de texto. Guarde el archivo como KeyFieldsA-Xdr.xml.
Copie la plantilla siguiente y péguela en un archivo de texto. Guarde el archivo como KeyFieldsA-XdrT.xml en el mismo directorio donde guardó KeyFieldsA-Xdr.xml.
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="KeyFieldsA-Xdr.xml"> /Order </sql:xpath-query> </ROOT>
La ruta de acceso al directorio especificada para el esquema de asignación (KeyFieldsA-Xdr.xml) es relativa al directorio donde se guarda la plantilla. También puede especificarse una ruta de acceso absoluta como, por ejemplo:
mapping-schema="C:\MyDir\KeyFieldsA-Xdr.xml"
Cree y use el script de prueba SQLXML 4.0 (Sqlxml4test.vbs) para ejecutar la plantilla.
Para obtener más información, vea Utilizar ADO para ejecutar consultas SQLXML 4.0.
El conjunto de resultados es el siguiente:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Order SalesOrderID="43659" CustomerID="676">
<Customer CustomerID="676" />
</Order>
<Order SalesOrderID="43660" CustomerID="117">
<Customer CustomerID="117" />
</Order>
<Order SalesOrderID="43661" CustomerID="442">
<Customer CustomerID="442" />
</Order>
...
</ROOT>
B. Especificar sql:key-fields para generar un anidamiento correcto del resultado
En este esquema, no se ha especificado ninguna jerarquía mediante <sql:relationship>. El esquema todavía requiere la anotación sql:key-fields especificada para identificar de forma única a empleados de la tabla HumanResources.Employee.
<?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="Title" content="textOnly" >
<AttributeType name="EmployeeID" />
<attribute type="EmployeeID" />
</ElementType>
<ElementType name="HumanResources.Employee" sql:key-fields="EmployeeID" >
<element type="Title" />
</ElementType>
</Schema>
Para probar un ejemplo funcional de este esquema
Copie el código de esquema anterior y péguelo en un archivo de texto. Guarde el archivo como KeyFieldsB-Xdr.xml.
Copie la plantilla siguiente y péguela en un archivo de texto. Guarde el archivo como KeyFieldsB-XdrT.xml en el mismo directorio donde guardó KeyFieldsB-Xdr.xml. La consulta XPath de la plantilla devuelve todos los elementos <Order>.
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="KeyFieldsB-Xdr.xml"> /HumanResources.Employee </sql:xpath-query> </ROOT>
La ruta de acceso al directorio especificada para el esquema de asignación (KeyFieldsB-Xdr.xml) es relativa al directorio donde se guarda la plantilla. También puede especificarse una ruta de acceso absoluta como, por ejemplo:
mapping-schema="C:\MyDir\KeyFieldsB-Xdr.xml"
Cree y use el script de prueba SQLXML 4.0 (Sqlxml4test.vbs) para ejecutar la plantilla.
Para obtener más información, vea Utilizar ADO para ejecutar consultas SQLXML 4.0.
A continuación se muestra parte del conjunto de resultados:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<HumanResources.Employee>
<Title EmployeeID="1">Production Technician - WC60</Title>
</HumanResources.Employee>
<HumanResources.Employee>
<Title EmployeeID="2">Marketing Assistant</Title>
</HumanResources.Employee>
<HumanResources.Employee>
<Title EmployeeID="3">Engineering Manager</Title>
</HumanResources.Employee>
...
</ROOT>