Partager via


Filtrage de valeurs à l'aide des annotations sql:limit-field et sql:limit-value (schéma XDR)

Important

Cette rubrique est fournie à titre de référence pour les applications héritées. Cette fonctionnalité ne fera plus l'objet d'aucun travail de développement. Évitez de l'utiliser dans vos nouveaux travaux de développement. Utilisez à la place des schémas XSD annotés pour créer des vues XML. Pour plus d'informations, consultez Introduction aux schémas XSD annotés (SQLXML 4.0). Vous pouvez convertir des schémas XDR annotés existants en schémas XSD. Pour plus d'informations, consultez Conversion de schémas XDR annotés en schémas XSD équivalents (SQLXML 4.0).

Vous pouvez limiter les lignes retournées par une requête de base de données en fonction d'une valeur de limitation. Ces annotations sont utilisées pour identifier la colonne de base de données qui contient les valeurs de limitation et spécifier une valeur de limitation spécifique à utiliser pour filtrer les données retournées.

L'annotation sql:limit-field est utilisée pour identifier une colonne qui contient une valeur de limitation. sql:limit-field est utilisé pour qualifier la relation de jointure spécifiée à l'aide de <sql:relationship>. sql:limit-field doit être utilisé sur un élément ou un attribut pour lequel <sql:relationship> est spécifié.

L'annotation sql:limit-value est utilisée pour spécifier la valeur limitée dans la colonne spécifiée dans une annotation sql:limit-field. Cette annotation est facultative. Si sql:limit-value n'est pas spécifié, une valeur NULL est considérée.

[!REMARQUE]

Lors de l'utilisation d'une annotation sql:limit-field où la colonne SQL mappée est de type float et real (Transact-SQL), SQLXML 4.0 effectue une conversion sur l'annotation sql:limit-value comme spécifié dans les schémas XML sous la forme d'une valeur nchar et nvarchar (Transact-SQL) spécifiée. Pour cela, les valeurs de limite décimales doivent être spécifiées à l'aide de la notation scientifique complète. Pour plus d'informations, consultez l'exemple B ci-dessous.

Exemples

Pour créer des exemples fonctionnels à l'aide des exemples suivants, vous devez respecter certaines conditions requises. Pour plus d'informations, consultez Configuration requise pour l'exécution des exemples SQLXML.

A. Limiter les adresses de clients retournées à un type d'adresse spécifique

Dans cet exemple, une base de données contient deux tables :

  • Customer (CustomerID, CompanyName)

  • Addresses (CustomerID, AddressType, StreetAddress)

Un client peut avoir une adresse de livraison et/ou facturation (les valeurs de la colonne AddressType sont Shipping et Billing).

Il s'agit du schéma de mappage dans lequel l'attribut de schéma ShipTo est mappé à la colonne StreetAddress dans la relation Adresses. Les valeurs retournées pour cet attribut sont limitées uniquement aux adresses de type Shipping en spécifiant les annotations sql:limit-field et sql:limit-value. De la même façon, l'attribut de schéma BillTo retourne uniquement l'adresse de type Billing d'un client.

Voici le schéma :

<?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>

Pour tester un exemple de requête XPath sur le schéma

  1. Créez les deux tables suivantes dans la base de données 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. Ajoutez les exemples de données :

    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. Copiez le code de schéma ci-dessus et collez-le dans un fichier texte. Enregistrez le fichier sous le nom LimitFieldValueXdr.xml.

  4. Copiez le modèle suivant et collez-le dans un fichier texte. Enregistrez le fichier sous le nom LimitFieldValueXdrT.xml dans le répertoire où vous avez enregistré le fichier LimitFieldValueXdr.xml. La requête dans le modèle sélectionne tous les enregistrements dans la table Customer.

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

    Le chemin d'accès au répertoire spécifié pour le schéma de mappage (LimitFieldValueXdr.xml) est relatif au répertoire dans lequel le modèle est enregistré. Vous pouvez également spécifier un chemin d'accès absolu, par exemple :

    mapping-schema="C:\MyDir\LimitFieldValueXdr.xml"
    
  5. Créez et utilisez le script de test SQLXML 4.0 (Sqlxml4test.vbs) pour exécuter le modèle.

    Pour plus d'informations, consultez Utilisation d'ADO pour exécuter des requêtes SQLXML 4.0.

Jeu de résultats obtenu :

<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. Limitation des résultats en fonction d'une valeur de remise de type de données real

Dans cet exemple, une base de données contient deux tables :

  • Orders (OrderID)

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

Ceci est le schéma de mappage dans lequel l'attribut OrderID sur les détails de commande est mappé à la colonne OrderID dans la relation Orders. Les valeurs retournées pour cet attribut sont limitées uniquement à celles qui ont une valeur de 2,0000000e-001 (0,2) comme spécifié pour l'attribut Discount à l'aide des annotations sql:limit-field et sql:limit-value.

Voici le schéma :

<?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>

Pour tester un exemple de requête XPath sur le schéma

  1. Créez deux tables dans la base de données 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. Ajoutez les exemples de données :

    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. Enregistrez le schéma (LimitFieldValue.xml) dans un répertoire.

  4. Créez le script de test suivant (TestQuery.vbs), modifiez MyServer en spécifiant le nom de votre ordinateur SQL Server et enregistrez-le dans le répertoire que vous avez utilisé à l'étape précédente pour enregistrer le schéma :

    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. Exécutez le fichier TestQuery.vbs en cliquant dessus dans l'Explorateur Windows.

    Voici le résultat obtenu :

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