Especificar relaciones mediante sql:relationship (esquema de 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 usarla 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). |
Los elementos de un documento XML pueden estar relacionados. Los elementos pueden estar anidados jerárquicamente y pueden especificarse relaciones ID, IDREF o IDREFS entre los elementos.
Por ejemplo, en un esquema XDR, un elemento <Customer> contiene elementos secundarios <Order>. El elemento <Customer> se asigna a una tabla que contiene datos del cliente (como Sales.Customer en la base de datos AdventureWorks). El elemento <Order> se asigna a una tabla que contiene datos de pedidos en la misma base de datos (como Sales.SalesORderHeader). Estas tablas subyacentes, Sales.Customer y Sales.SalesOrderHeader, están relacionadas, puesto que los clientes realizan pedidos. La columna CustomerID de la tabla Sales.SalesOrderHeader es una clave externa que hace referencia a la clave principal CustomerID de la tabla Sales.Customer. Puede establecer estas relaciones entre elementos del esquema de asignación utilizando la anotación <sql:relationship>.
En el esquema XDR anotado, la anotación <sql:relationship> se usa para anidar jerárquicamente los elementos de esquema en función de las relaciones de clave principal y clave externa entre las tablas subyacentes a las que se asignan los elementos. Para especificar la anotación <sql:relationship>, debe identificar:
La tabla principal (Sales.Customer) y la tabla externa (Sales.SalesOrderHeader), así como
La condición de combinación necesaria (la columna CustomerID de la tabla Sales.SalesOrderHeader es una clave externa que hace referencia a la clave principal CustomerID de la tabla Sales.Customer).
Esta información se usa para generar la jerarquía apropiada (para cada elemento <Customer>, los elementos <Order> relacionados se muestran como elementos secundarios).
Para proporcionar los nombres de tabla y la información de unión necesaria, se especifican los atributos siguientes en la anotación <sql:relationship>. Estos atributos sólo son válidos con el elemento sql:relationship:
key-relation
Especifica la relación primaria (tabla).key
Especifica la clave principal de key-relation. Si la clave principal está compuesta de varias columnas, los valores se especifican con un espacio entre ellos. Hay una asignación de posición entre los valores especificados para la clave de varias columnas y la clave externa correspondiente.foreign-relation
Especifica la relación externa (tabla).foreign-key
Especifica la clave externa de foreign-relation que hace referencia a key en key-relation. Si la clave externa está compuesta de varios atributos (columnas), los valores de clave externa se especifican con un espacio entre ellos. Hay una asignación de posición entre los valores especificados para la clave de varias columnas y la clave externa correspondiente.
[!NOTA]
Debe asegurarse de que los tipos de datos de Microsoft SQL Server de key y foreign-key puedan convertirse de forma implícita si es necesario.
La etiqueta sql:relationship sólo puede agregarse a elementos <element> o <attribute> en un esquema anotado. Cuando se especifica sql:relationship en un atributo, debe especificarse sql:relation y sql:field para el atributo, a fin de asegurarse de que se recupera un valor único (no es válido usar varios atributos con el mismo nombre en XML). Cuando se especifica sql:relationship en un elemento, la relación puede dar lugar a un valor único o un conjunto de valores.
La etiqueta sql:relationship se usa para especificar una relación lógica única entre dos entidades. Los atributos definen las relaciones y los campos que se usan para definir la relación lógica. Es posible especificar varias instancias de sql:relationship dentro de un elemento o atributo en el esquema anotado, lo que indica una relación compleja entre el elemento o atributo y su elemento incluido. Todas las instancias de sql:relationship se usan juntas para definir la relación compleja.
Cuando se especifican varias instancias de la etiqueta sql:relationship dentro de un elemento o atributo, el orden en el que aparecen es significativo.
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. Para obtener más información, vea Identificar columnas de claves mediante sql:key-fields (SQLXML 4.0). Para generar un anidamiento correcto en el resultado, es recomendable especificar sql:key-fields en todos los esquemas.
[!NOTA]
En el esquema de asignación, los valores relacionales, como el nombre de tabla y el nombre de columna, distinguen mayúsculas de minúsculas.
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. Especificar sql:relationship en <element>
Este esquema XDR anotado incluye los elementos <Customer> y <Order>. El elemento <Order> es un elemento secundario del elemento <Customer>.
En el esquema, la anotación sql:relationship se especifica en el elemento secundario <Order>. La anotación identifica la columna CustomerID de la tabla Sales.SalesOrderHeader como una clave externa que hace referencia a la clave principal CustomerID de la tabla Sales.Customer. Por lo tanto, los pedidos pertenecientes a un cliente se muestran como un elemento secundario de ese elemento <Customer>.
<?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" >
<AttributeType name="CustomerID" />
<AttributeType name="SalesOrderID" />
<AttributeType name="OrderDate" />
<attribute type="CustomerID" />
<attribute type="SalesOrderID" />
<attribute type="OrderDate" />
</ElementType>
<ElementType name="Customer" sql:relation="Sales.Customer" >
<AttributeType name="CustomerID" />
<attribute type="CustomerID" />
<element type="Order" >
<sql:relationship
key-relation="Sales.Customer"
key="CustomerID"
foreign-key="CustomerID"
foreign-relation="Sales.SalesOrderHeader" />
</element>
</ElementType>
</Schema>
[!NOTA]
En el esquema de asignación, los valores relacionales, como el nombre de tabla y el nombre de columna, distinguen mayúsculas de minúsculas. En el ejemplo anterior, Customers es el valor del atributo sql:relation. El valor del atributo key-relation correspondiente también debe ser Customers.
Para probar una consulta XPath de ejemplo en el esquema
Copie el código de esquema anterior y péguelo en un archivo de texto. Guarde el archivo como sql-relationship-xdr.xml.
Copie la plantilla siguiente y péguela en un archivo de texto. Guarde el archivo como sql-relationship-xdrT.xml en el mismo directorio donde guardó sql-relationship-xdr.xml. La consulta de la plantilla selecciona un cliente cuyo CustomerID es 1.
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="sql-relationship-xdr.xml"> Customer[@CustomerID="1"] </sql:xpath-query> </ROOT>
La ruta de acceso al directorio especificada para el esquema de asignación (sql-relationship-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:\SqlXmlTest\sql-relationship-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.
Éste es el conjunto de resultados parciales:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Customer CustomerID="1">
<Order CustomerID="1" SalesOrderID="43860" OrderDate="2001-08-01T00:00:00" />
<Order CustomerID="1" SalesOrderID="44501" OrderDate="2001-11-01T00:00:00" />
<Order CustomerID="1" SalesOrderID="45283" OrderDate="2002-02-01T00:00:00" />
<Order CustomerID="1" SalesOrderID="46042" OrderDate="2002-05-01T00:00:00" />
</Customer>
</ROOT>
B. Especificar sql:relationship en <attribute> y crear referencias a un documento usando ID e IDREFS.
En este ejemplo, se especifican referencias a un documento local utilizando ID e IDREFS. El esquema XDR de ejemplo consta de un elemento <Customer> que se asigna a la tabla Sales.Customer. Este elemento consta de un elemento secundario <Order> que se asigna a la tabla Sales.SalesOrderHeader.
En el ejemplo, sql:relationship se especifica dos veces:
sql:relationship se especifica en el elemento secundario <Order>. Por lo tanto, los pedidos pertenecientes a un cliente se mostrarán como un elemento secundario de ese elemento <Customer>.
sql:relationship también se especifica en el atributo OrderIDList del elemento <Customer>. Este atributo se define como un atributo de tipo IDREFS que hace referencia al atributo SalesOrderID (un atributo de tipo ID) del elemento <Order>. Por lo tanto, se requiere sql:relationship. En este caso, la anotación sql:relationship permite que una lista de pedidos pertenecientes a un cliente se muestre con ese elemento <Customer>.
Los atributos especificados como IDREFS pueden usarse para hacer referencia a los atributos de tipo ID, lo que habilita los vínculos entre documentos.
Dado que los números no son valores de ID válidos (deben ser tokens de nombre), se ha utilizado sql:id-prefix para convertir el identificador de pedido en un valor de cadena. Para obtener más información, vea Crear atributos válidos de tipo ID, IDREF e IDREFS mediante sql:id-prefix (esquema de XDR).
<?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" >
<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" />
<attribute type="CustomerID" />
<AttributeType name="OrderIDList" dt:type="idrefs"
sql:id-prefix="Ord-"/>
<attribute type="OrderIDList" 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.Customer"
key="CustomerID"
foreign-relation="Sales.SalesOrderHeader"
foreign-key="CustomerID" />
</element>
</ElementType>
</Schema>
Para probar una consulta XPath de ejemplo en el esquema
Copie el código de esquema anterior y péguelo en un archivo de texto. Guarde el archivo como idIdref-xdr.xml.
Copie la plantilla siguiente y péguela en un archivo de texto. Guarde el archivo como idIdref-xdrT.xml en el mismo directorio donde guardó idIdref-xdr.xml. La consulta de la plantilla selecciona un cliente cuyo CustomerID es 1.
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="idIdref-xdr.xml"> Customer[@CustomerID="1"] </sql:xpath-query> </ROOT>
La ruta de acceso al directorio especificada para el esquema de asignación (idIdref-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:\SqlXmlTest\idIdref-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">
<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>
C. Especificar sql:relationship en varios elementos
En este ejemplo, el esquema XDR anotado consta de los elementos <Customer>, <Order> y <OD>.
El elemento <Order> es un elemento secundario del elemento <Customer>. sql:relationship se especifica en el elemento secundario <Order> para que los pedidos pertenecientes a un cliente se muestren como elementos secundarios de <Customer>.
El elemento <Order> incluye el elemento secundario <OD>. sql:relationship se especifica en el elemento secundario <OD> para que los detalles pertenecientes a un pedido se muestren como elementos secundarios de dicho elemento <Order>.
<?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="OD" sql:relation="Sales.SalesOrderDetail" >
<AttributeType name="SalesOrderID" />
<AttributeType name="ProductID" />
<attribute type="SalesOrderID" />
<attribute type="ProductID" />
</ElementType>
<ElementType name="Order" sql:relation="Sales.SalesOrderHeader" >
<AttributeType name="CustomerID" />
<AttributeType name="SalesOrderID" />
<AttributeType name="OrderDate" />
<attribute type="CustomerID" />
<attribute type="SalesOrderID" />
<attribute type="OrderDate" />
<element type="OD" >
<sql:relationship
key-relation="Sales.SalesOrderHeader"
key="SalesOrderID"
foreign-key="SalesOrderID"
foreign-relation="Sales.SalesOrderDetail" />
</element>
</ElementType>
<ElementType name="Customer" sql:relation="Sales.Customer" >
<AttributeType name="CustomerID" />
<attribute type="CustomerID" />
<element type="Order" >
<sql:relationship
key-relation="Sales.Customer"
key="CustomerID"
foreign-key="CustomerID"
foreign-relation="Sales.SalesOrderHeader" />
</element>
</ElementType>
</Schema>
Para probar una consulta XPath de ejemplo en el esquema
Copie el código de esquema anterior y péguelo en un archivo de texto. Guarde el archivo como sql-relationship-multi-xdr.xml.
Copie la plantilla siguiente y péguela en un archivo de texto. Guarde el archivo como sql-relationship-multi-xdrT.xml en el mismo directorio donde guardó sql-relationship-multi-xdr.xml. La consulta de la plantilla devuelve información de pedidos de un cliente cuyo CustomerID es 1 y cuyo SalesOrderID es 43860.
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="sql-relationship-multi-xdr.xml"> /Customer[@CustomerID="1"]/Order[@SalesOrderID=43860] </sql:xpath-query> </ROOT>
La ruta de acceso al directorio especificada para el esquema de asignación (sql-relationship-multi-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:\SqlXmlTest\sql-relationship-multi-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:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Order CustomerID="1" SalesOrderID="43860" OrderDate="2001-08-01T00:00:00">
<OD SalesOrderID="43860" ProductID="761" />
<OD SalesOrderID="43860" ProductID="770" />
<OD SalesOrderID="43860" ProductID="758" />
<OD SalesOrderID="43860" ProductID="765" />
<OD SalesOrderID="43860" ProductID="732" />
<OD SalesOrderID="43860" ProductID="762" />
<OD SalesOrderID="43860" ProductID="738" />
<OD SalesOrderID="43860" ProductID="768" />
<OD SalesOrderID="43860" ProductID="753" />
<OD SalesOrderID="43860" ProductID="729" />
<OD SalesOrderID="43860" ProductID="763" />
<OD SalesOrderID="43860" ProductID="756" />
</Order>
</ROOT>
D. Especificar relaciones indirectas
En este ejemplo, el esquema XDR anotado consta de los elementos <Customer> y <OD>. La relación entre estos elementos es indirecta (la tabla Sales.Customer se relaciona con la tabla Sales.SalesOrderDetail a través de la tabla Sales.SalesOrderHeader). Para relacionar un cliente con los detalles del pedido, primero se especifica la relación entre la tabla Sales.Customer y la tabla Sales.SalesOrderHeader. A continuación, se especifica la relación entre las tablas Sales.SalesOrderHeader y Sales.SalesOrderDetail.
É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="OD" sql:relation="Sales.SalesOrderDetail" >
<AttributeType name="SalesOrderID" />
<AttributeType name="ProductID" />
<AttributeType name="UnitPrice" />
<attribute type="SalesOrderID" />
<attribute type="ProductID" />
<attribute type="UnitPrice" />
</ElementType>
<ElementType name="Customer" sql:relation="Sales.Customer" >
<AttributeType name="CustomerID" />
<attribute type="CustomerID" />
<element type="OD" >
<sql:relationship
key-relation="Sales.Customer"
key="CustomerID"
foreign-relation="Sales.SalesOrderHeader"
foreign-key="CustomerID"/>
<sql:relationship
key-relation="Sales.SalesOrderHeader"
key="SalesOrderID"
foreign-relation="Sales.SalesOrderDetail"
foreign-key="SalesOrderID" />
</element>
</ElementType>
</Schema>
Para probar una consulta XPath de ejemplo en el esquema
Copie el código de esquema anterior y péguelo en un archivo de texto. Guarde el archivo como indirect-relationship-xdr.xml.
Copie la plantilla siguiente y péguela en un archivo de texto. Guarde el archivo como indirect-relationship-xdrT.xml en el mismo directorio donde guardó indirect-relationship-xdr.xml. La consulta de la plantilla devuelve información de pedidos para un cliente cuyo CustomerID es 1.
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql" > <sql:xpath-query mapping-schema="indirect-relationship-xdr.xml" > /Customer[@CustomerID="1"] </sql:xpath-query> </ROOT>
La ruta de acceso al directorio especificada para el esquema de asignación (indirect-relationship-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:\SqlXmlTest\indirect-relationship-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.
Éste es el resultado parcial:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Customer CustomerID="1">
<OD SalesOrderID="43860" ProductID="761" UnitPrice="503.3507" />
<OD SalesOrderID="43860" ProductID="770" UnitPrice="503.3507" />
<OD SalesOrderID="43860" ProductID="758" UnitPrice="1049.7528" />
<OD SalesOrderID="43860" ProductID="765" UnitPrice="503.3507" />
...
</Customer>
</ROOT>
E. Especificar relaciones de unión de varias claves
Para especificar una unión mediante sql:relationship, puede especificar una unión que implique dos o más columnas. En este caso, los nombres de columna de key y foreign-key se muestran utilizando un espacio.
En este ejemplo se da por supuesto que estas dos tablas existen en una base de datos temporal (como tempdb):
dbo.Cust (fname, lname)
dbo.Ord (OrderID, fname, lname)
Las columnas fname y lname forman la clave principal de la tabla Cust. La columna OrderID es la clave principal de la tabla Ord. Las columnas fname y lname de la tabla Ord son claves externas que hacen referencia a la clave principal fname y lname de la tabla Cust.
Este esquema consta de los elementos <Cust> y <Ord>. sql:relationship se usa para unirlos.
<?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="Ord" sql:relation="Ord" >
<AttributeType name="OrderID" />
<attribute type="OrderID" />
</ElementType>
<ElementType name="Cust" sql:relation="Cust" >
<AttributeType name="fname" />
<AttributeType name="lname" />
<attribute type="fname" />
<attribute type="lname" />
<element type="Ord" >
<sql:relationship
key-relation="Cust"
key="fname lname"
foreign-relation="Ord"
foreign-key="fname lname"/>
</element>
</ElementType>
</Schema>
Para probar una consulta XPath de ejemplo en el esquema
Cree las dos tablas, Cust y Ord.
USE tempdb CREATE TABLE dbo.Cust( fname varchar(20), lname varchar(20) ) CREATE TABLE dbo.Ord ( OrderID int primary key, fname varchar(20), lname varchar(20) ) GO
Agregue estos datos de ejemplo:
INSERT INTO Cust values ('Nancy', 'Davolio') INSERT INTO Cust values('Andrew', 'Fuller') INSERT INTO Ord values (1,'Nancy', 'Davolio') INSERT INTO Ord values (2,'Nancy', 'Davolio') INSERT INTO Ord values (3,'Andrew', 'Fuller')
Copie el código de esquema anterior y péguelo en un archivo de texto. Guarde el archivo como multikey-join-xdr.xml.
Copie la plantilla siguiente y péguela en un archivo de texto. Guarde el archivo como multikey-join-xdrT.xml en el mismo directorio donde guardó multikey-join-xdr.xml. La consulta de la plantilla devuelve la información del cliente.
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql" > <sql:xpath-query mapping-schema="multikey-join-xdr.xml" > /Cust </sql:xpath-query> </ROOT>
La ruta de acceso al directorio especificada para el esquema de asignación (multikey-join-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:\SqlXmlTest\multikey-join-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.
Éste es el resultado parcial:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Cust fname="Andrew" lname="Fuller">
<Ord OrderID="3" />
</Cust>
<Cust fname="Nancy" lname="Davolio">
<Ord OrderID="1" />
<Ord OrderID="2" />
</Cust>
</ROOT>