Delen via


Waarden filteren met sql:limit-field en sql:limit-value (SQLXML 4.0)

Van toepassing op:SQL ServerAzure SQL Database

Je kunt rijen die worden teruggegeven vanuit een databasequery beperken op basis van een limietwaarde. De sql:limit-field en sql:limit-value annotaties worden gebruikt om de databasekolom te identificeren die limietwaarden bevat en om een specifieke limietwaarde te specificeren die gebruikt moet worden om de teruggegeven data te filteren.

De sql:limit-field annotatie wordt gebruikt om een kolom te identificeren die een limietwaarde bevat; het is toegestaan op elk toegewezen element of attribuut.

De sql:limit-value annotatie wordt gebruikt om de beperkte waarde in de kolom te specificeren die in de sql:limit-field annotatie is opgegeven. De sql:limit-value annotatie is optioneel. Als sql:limit-value niet wordt gespecificeerd, wordt aangenomen dat er een NULL-waarde is.

Opmerking

Bij het werken met een sql:limit-veld waarbij de gemapte SQL-kolom van het type real is, voert SQLXML 4.0 conversie uit op de sql:limit-value zoals gespecificeerd in XML-schema's als een nvarchar-gespecificeerde waarde. Dit vereist dat decimale limietwaarden worden gespecificeerd met volledige wetenschappelijke notatie. Voor meer informatie, zie Voorbeeld B hieronder.

Voorbeelden

Om werkmonsters te maken met deze voorbeelden, moet je het volgende geïnstalleerd hebben:

  • Microsoft SQL Server Native Client

  • MDAC 2.6 of later

In deze voorbeelden worden sjablonen gebruikt om XPath-queries te specificeren tegen het mapping XSD-schema.

Eén. Het beperken van de klantadressen die terugkomen tot een specifiek adrestype

In dit voorbeeld bevat een database twee tabellen:

  • Klant (CustomerID, Bedrijfsnaam)

  • Adressen (KlantID, AdresType, Straatadres)

Een klant kan een verzendadres en/of een factuuradres hebben. De kolomwaarden van AddressType zijn Verzending en Facturering.

Dit is het mappingschema waarin het ShipTo-schema-attribuut wordt gekoppeld aan de kolom StreetAddress in de Address-relatie. De waarden die voor dit attribuut worden teruggegeven, zijn beperkt tot alleen verzendadressen door de sql:limit-field en sql:limit-value annotaties te specificeren. Evenzo geeft het BillTo schema-attribuut alleen het factuuradres van een klant terug.

Dit is het schema:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"  
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema">  
<xsd:annotation>  
  <xsd:appinfo>  
    <sql:relationship name="CustAddr"  
        parent="Customer"  
        parent-key="CustomerID"  
        child="Addresses"  
        child-key="CustomerID" />  
  </xsd:appinfo>  
</xsd:annotation>  
  
  <xsd:element name="Customer" sql:relation="Customer" >  
   <xsd:complexType>  
        <xsd:sequence>  
        <xsd:element name="BillTo"   
                       type="xsd:string"   
                       sql:relation="Addresses"   
                       sql:field="StreetAddress"  
                       sql:limit-field="AddressType"  
                       sql:limit-value="billing"  
                       sql:relationship="CustAddr" >  
        </xsd:element>  
        <xsd:element name="ShipTo"   
                       type="xsd:string"   
                       sql:relation="Addresses"   
                       sql:field="StreetAddress"  
                       sql:limit-field="AddressType"  
                       sql:limit-value="shipping"  
                       sql:relationship="CustAddr" >  
        </xsd:element>  
        </xsd:sequence>  
        <xsd:attribute name="CustomerID"   type="xsd:int" />   
        <xsd:attribute name="CompanyName"  type="xsd:string" />  
    </xsd:complexType>  
  </xsd:element>  
</xsd:schema>  
Om een voorbeeld van een XPath-query te testen tegen het schema
  1. Maak twee tabellen aan in de tempdb-database :

    USE tempdb  
    CREATE TABLE Customer (CustomerID int primary key,   
                           CompanyName varchar(30))  
    CREATE TABLE Addresses(CustomerID int,   
                           StreetAddress varchar(50),  
                           AddressType varchar(10))  
    
  2. Voeg de voorbeeldgegevens toe:

    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 2222 M?xico D.F.', 'shipping')  
    INSERT INTO Addresses values  
               (2, '120 Hanover Sq., London', 'billing')  
    INSERT INTO Addresses values  
               (2, 'Forsterstr. 57, Mannheim', 'shipping')  
    
  3. Kopieer de bovenstaande schemacode en plak deze in een tekstbestand. Sla het bestand op als LimitFieldValue.xml.

  4. Maak de volgende template aan (LimitFieldValueT.xml), en sla deze op in dezelfde situatie als waar je het schema (LimitFieldValue.xml) in de vorige stap hebt opgeslagen:

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

    Het directorypad dat voor het mappingschema (LimitFieldValue.xml) is gespecificeerd is relatief tot de map waar het sjabloon wordt opgeslagen. Een absoluut pad kan ook worden gespecificeerd, bijvoorbeeld:

    mapping-schema="C:\MyDir\LimitFieldValue.xml"  
    
  5. Maak het SQLXML 4.0 Test Script (Sqlxml4test.vbs) aan en gebruik het om het sjabloon uit te voeren.

    Voor meer informatie, zie Gebruik ADO om SQLXML-queries uit te voeren.

Dit is het resultaat:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">   
  <Customer CustomerID="1" CompanyName="Company A">   
     <BillTo>Obere Str. 57 Berlin</BillTo>   
     <ShipTo>Avda. de la Constituci?n 2222 M?xico D.F.</ShipTo>   
  </Customer>   
  <Customer CustomerID="2" CompanyName="Company B">   
     <BillTo>120 Hanover Sq., London</BillTo>   
     <ShipTo>Forsterstr. 57, Mannheim</ShipTo>   
   </Customer>   
</ROOT>  

B. Beperkende resultaten op basis van een disconteringswaarde van het type reële data

In dit voorbeeld bevat een database twee tabellen:

  • Orders (OrderID)

  • Orderdetails (OrderID, ProductID, Eenheidsprijs, Hoeveelheid, Prijs, Korting)

Dit is het mappingschema waarbij het OrderID-attribuut op de orderdetails wordt gekoppeld aan de OrderID-kolom in de orderrelatie. De waarden die voor dit attribuut worden teruggegeven, zijn beperkt tot alleen die welke een waarde van 2,0000000e-001 (0,2) hebben, zoals gespecificeerd voor het Discount-attribuut met behulp van de sql:limit-field en sql:limit-value annotaties.

Dit is het schema:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"  
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema">  
  <xsd:annotation>  
   <xsd:appinfo>  
    <sql:relationship name="OrderOrderDetails"  
        parent="Orders"  
        parent-key="OrderID"  
        child="OrderDetails"  
        child-key="OrderID" />  
   </xsd:appinfo>  
  </xsd:annotation>  
  <xsd:element name="root" sql:is-constant="1">  
   <xsd:complexType>  
     <xsd:sequence>  
       <xsd:element name="Order" sql:relation="Orders" >  
          <xsd:complexType>  
             <xsd:sequence>  
                <xsd:element name="orderDetail"   
                       sql:relation="OrderDetails"   
                       sql:limit-field="Discount"                       sql:limit-value="2.0000000e-001"  
                       sql:relationship="OrderOrderDetails">  
                   <xsd:complexType>  
                     <xsd:attribute name="OrderID"   />   
                     <xsd:attribute name="ProductID" />   
                     <xsd:attribute name="Discount"  />   
                     <xsd:attribute name="Quantity"  />   
                     <xsd:attribute name="UnitPrice" />   
                   </xsd:complexType>  
                </xsd:element>  
            </xsd:sequence>  
           <xsd:attribute name="OrderID"/>   
          </xsd:complexType>  
       </xsd:element>  
     </xsd:sequence>  
   </xsd:complexType>  
  </xsd:element>  
</xsd:schema>  
Om een voorbeeld van een XPath-query te testen tegen het schema
  1. Maak twee tabellen aan in de tempdb-database :

    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. Voeg de voorbeeldgegevens toe:

    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. Sla het schema (LimitFieldValue.xml) op in een map.

  4. Maak het volgende testscript aan (TestQuery.vbs), wijzig MyServer naar de naam van je SQL Server-computer en sla het op in dezelfde map als in de vorige stap om het schema op te slaan:

    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}"  
    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. Voer het TestQuery.vbs-bestand uit door erop te klikken in Windows Verkenner.

    Dit is het resultaat:

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

Zie ook

drijvend en echt (Transact-SQL)
nchar en nvarchar (Transact-SQL)
SQL Server Native Client installeren
Gebruik van geannoteerde XSD-schema's in queries (SQLXML 4.0)