Compartir a través de


Filtrar valores mediante sql:limit-field y sql:limit-value (esquema XDR)

Nota importanteImportante

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).

Puede limitar filas devueltas de una consulta de base de datos basada en algunos valores de limitación. Estas anotaciones se usan para identificar la columna de base de datos que contiene valores de limitación y para especificar un valor de limitación concreto que se va a usar para filtrar los datos devueltos.

La anotación sql:limit-field se usa para identificar una columna que contiene una valor de limitación. sql:limit-field se usa para calificar la relación de combinación especificada mediante <sql:relationship>. Se debe usar sql:limit-field en un elemento o atributo que tiene <sql:relationship> especificado.

La anotación sql:limit-value se usa para especificar el valor limitado en la columna especificada en una anotación sql:limit-field. Esta anotación es opcional. Si no se especifica sql:limit-value, se supone un valor NULL.

[!NOTA]

Al trabajar con sql:limit-field donde la columna SQL asignada es del tipo float y real (Transact-SQL), SQLXML 4.0 realiza la conversión en sql:limit-value como se especifica en los esquemas XML como un valor especificado nchar y nvarchar (Transact-SQL). Esto requiere que se especifiquen valores de límite decimal mediante la notación científica completa. Para obtener más información, vea el ejemplo B a continuación.

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. Limitar las direcciones de cliente devueltas a un tipo de dirección específica

En este ejemplo, una base de datos contiene dos tablas:

  • Customer (CustomerID, CompanyName)

  • Addresses (CustomerID, AddressType, StreetAddress)

Un cliente puede tener un envío y/o una dirección de facturación (los valores de columna AddressType son Shipping y Billing).

Éste es el esquema de asignación en el que el atributo de esquema ShipTo asigna a la columna StreetAddress en la relación de Addresses. Los valores devueltos para este atributo se limitan sólo direcciones Shipping especificando las anotaciones sql:limit-field y sql:limit-value. De igual forma, el atributo de esquema BillTo sólo devuelve la dirección Billing de un cliente.

É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="Customer" >
    <AttributeType name="CustomerID" />
    <AttributeType name="CompanyName" />
    <AttributeType name="BillTo" />
    <AttributeType name="ShipTo" />

    <attribute type="CustomerID" />
    <attribute type="CompanyName" />
    <attribute type="BillTo" 
                sql:limit-field="AddressType"
                sql:limit-value="billing"
                sql:field="StreetAddress"
                sql:relation="Addresses" >
                <sql:relationship 
                        key="CustomerID"
                        key-relation="Customer"
                       foreign-relation="Addresses"
                       foreign-key="CustomerID" />
    </attribute>
    <attribute type="ShipTo" 
                sql:limit-field="AddressType"
                sql:limit-value="shipping"
                sql:field="StreetAddress"
                sql:relation="Addresses" >
                <sql:relationship 
                     key="CustomerID"
                     key-relation="Customer"
                     foreign-relation="Addresses"
                     foreign-key="CustomerID" />
    </attribute>
</ElementType>
</Schema>

Para probar una consulta XPath de ejemplo en el esquema

  1. Cree las dos tablas siguientes en la base de datos tempdb:

    USE tempdb
    CREATE TABLE Customer (CustomerID int primary key, 
                           CompanyName varchar(30))
    CREATE TABLE Addresses(CustomerID int, 
                           StreetAddress varchar(50),
                           AddressType varchar(10))
    
  2. Agregue los datos de ejemplo:

    INSERT INTO Customer values (1, 'Company A')
    INSERT INTO Customer values (2, 'Company B')
    
    INSERT INTO Addresses values
                (1, 'Obere Str. 57 Berlin', 'billing')
    INSERT INTO Addresses values
                (1, 'Avda. de la Constitución 2222México D.F.', 'shipping')
    INSERT INTO Addresses values
                (2, '120 Hanover Sq., London', 'billing')
    INSERT INTO Addresses values
                (2, 'Forsterstr. 57, Mannheim', 'shipping')
    
  3. Copie el código de esquema anterior y péguelo en un archivo de texto. Guarde el archivo como LimitFieldValueXdr.xml.

  4. Copie la plantilla siguiente y péguela en un archivo de texto. Guarde el archivo como LimitFieldValueXdrT.xml en el mismo directorio en el que guardó LimitFieldValueXdr.xml. La consulta de la plantilla selecciona todos los registros de la tabla Customer.

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
      <sql:xpath-query mapping-schema="LimitFieldValueXdr.xml">
        /Customer
      </sql:xpath-query>
    </ROOT>
    

    La ruta de acceso al directorio especificada para el esquema de asignación (LimitFieldValueXdr.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\LimitFieldValueXdr.xml"
    
  5. 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" CompanyName="Company A" 
          BillTo="Obere Str. 57 Berlin" 
          ShipTo="Avda. de la Constitución 2222México D.F." /> 
  <Customer CustomerID="2" CompanyName="Company B" 
          BillTo="120 Hanover Sq., London" 
          ShipTo="Forsterstr. 57, Mannheim" /> 
</ROOT>

B. Limitar los resultados basándose en un valor de descuento de datos de tipo real

En este ejemplo, una base de datos contiene dos tablas:

  • Orders (OrderID)

  • OrderDetails (OrderID, ProductID, UnitPrice, Quantity, Price, Discount)

Éste es el esquema de asignación en el que el atributo OrderID de los detalles de los pedidos se asigna a la columna OrderID de la relación de los pedidos. Los valores devueltos para este atributo sólo se limitan a los que tienen un valor de 2.0000000e-001 (0.2) como se especifica para el atributo Discount usando las anotaciones sql:limit-field y sql:limit-value.

É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="root" sql:is-constant="1">
    <element type="Order"/>
  </ElementType>

  <ElementType name="orderDetail" sql:relation="OrderDetails">
     <AttributeType name="OrderID" />
     <AttributeType name="ProductID" />
     <AttributeType name="Discount" />
     <AttributeType name="Quantity" />
     <attribute type="OrderID" />
     <attribute type="ProductID" />
     <attribute type="Discount" />
     <attribute type="Quantity" />
  </ElementType>

  <ElementType name="Order" sql:relation="Orders">
     <AttributeType name="OrderID"/>
     <attribute type="OrderID"/>
     <element type="orderDetail"  
              sql:limit-field="Discount" 
              sql:limit-value="2.0000000e-001">
        <sql:relationship key="OrderID"
                          key-relation="Orders"
                          foreign-relation="OrderDetails"
                          foreign-key="OrderID"/>
     </element>
  </ElementType>

</Schema>

Para probar una consulta XPath de ejemplo en el esquema

  1. Cree dos tablas en la base de datos tempdb:

    USE tempdb
    CREATE TABLE Orders ([OrderID] int NOT NULL ) ON [PRIMARY]
    ALTER TABLE Orders WITH NOCHECK ADD 
    CONSTRAINT [PK_Orders] PRIMARY KEY  CLUSTERED (
       [OrderID]
     )  ON [PRIMARY] 
    CREATE TABLE [OrderDetails] (
       [OrderID] int NOT NULL ,
       [ProductID] int NOT NULL ,
       [UnitPrice] money NULL ,
       [Quantity] smallint NOT NULL ,
       [Discount] real NOT NULL 
    ) ON [PRIMARY]
    
  2. Agregue los datos de ejemplo:

    INSERT INTO Orders ([OrderID]) values (10248)
    INSERT INTO Orders ([OrderID]) values (10250)
    INSERT INTO Orders ([OrderID]) values (10251)
    INSERT INTO Orders ([OrderID]) values (10257)
    INSERT INTO Orders ([OrderID]) values (10258)
    INSERT INTO [OrderDetails] ([OrderID],[ProductID],[UnitPrice],[Quantity],[Discount]) values (10248,11,14,12,0)
    INSERT INTO [OrderDetails] ([OrderID],[ProductID],[UnitPrice],[Quantity],[Discount]) values (10250,51,42.4,35,0.15)
    INSERT INTO [OrderDetails] ([OrderID],[ProductID],[UnitPrice],[Quantity],[Discount]) values (10251,22,16.8,6,0.05)
    INSERT INTO [OrderDetails] ([OrderID],[ProductID],[UnitPrice],[Quantity],[Discount]) values (10257,77,10.4,15,0)
    INSERT INTO [OrderDetails] ([OrderID],[ProductID],[UnitPrice],[Quantity],[Discount]) values (10258,2,15.2,50,0.2)
    
  3. Guarde el esquema (LimitFieldValue.xml) en un directorio.

  4. Cree el script de prueba siguiente (TestQuery.vbs), modifique MyServer al nombre de su equipo de SQL Server y guárdelo en el mismo directorio que usó en el paso anterior para guardar el esquema:

    Set conn = CreateObject("ADODB.Connection")
    conn.Open "Provider=SQLOLEDB;Data Source=MyServer;Database=tempdb;Integrated Security=SSPI"
    conn.Properties("SQLXML Version") = "sqlxml.4.0" 
    Set cmd = CreateObject("ADODB.Command")
    Set stm = CreateObject("ADODB.Stream")
    Set cmd.ActiveConnection = conn
    stm.open
    result ="none"
    strXPathQuery="/root"
    DBGUID_XPATH = "{EC2A4293-E898-11D2-B1B7-00C04F680C56}"
    'DBGUID_MSSQLXML = "{5d531cb2-e6ed-11d2-b252-00c04f681b71}"
    cmd.Dialect = DBGUID_XPATH
    cmd.CommandText = strXPathQuery
    cmd.Properties("Mapping schema") = "LimitFieldReal.xml"
    cmd.Properties("Output Stream").Value = stm
    cmd.Properties("Output Encoding") = "utf-8"
    WScript.Echo "executing for xml query"
    On Error Resume Next
    cmd.Execute , ,1024
    if err then
    Wscript.Echo err.description
    Wscript.Echo err.Number
    Wscript.Echo err.source
    On Error GoTo 0
    else
    stm.Position = 0
    result  = stm.ReadText
    end if
    WScript.Echo result
    Wscript.Echo "done"
    
  5. En el Explorador de Windows, haga clic en el archivo TestQuery.vbs para ejecutarlo.

    El resultado es el siguiente:

    <root>
      <Order OrderID="10248"/>
      <Order OrderID="10250"/>
      <Order OrderID="10251"/>
      <Order OrderID="10257"/>
      <Order OrderID="10258">
        <orderDetail OrderID="10258" 
                     ProductID="2" 
                     Discount="0.2" 
                     Quantity="50"/>
      </Order>
    </root>
    

Vea también

Referencia