Dela via


Filtrering av värden med sql:limit-field och sql:limit-value (SQLXML 4.0)

gäller för:SQL ServerAzure SQL Database

Du kan begränsa rader som returneras från en databasfråga baserat på något begränsande värde. sql:limit-field och sql:limit-value-annotationerna används för att identifiera databaskolumnen som innehåller gränsvärden och för att specificera ett specifikt gränsvärde som ska användas för att filtrera den returnerade datan.

sql:limit-field-annotationen används för att identifiera en kolumn som innehåller ett gränsvärde; det är tillåtet på varje mappat element eller attribut.

sql:limit-value-annotationen används för att ange det begränsade värdet i kolumnen som anges i sql:limit-field-annotationen. sql:limit-value-annotationen är valfri. Om sql:limit-value inte specificeras, antas ett NULL-värde.

Anmärkning

När man arbetar med ett sql:limit-fält där den mappade SQL-kolumnen är av typen real, utför SQLXML 4.0 konvertering på sql:limit-value enligt XML-scheman som ett nvarchar-specificerat värde. Detta kräver att decimalgränsvärden anges med fullständig vetenskaplig notation. För mer information, se Exempel B nedan.

Examples

För att skapa arbetsprover med dessa exempel behöver du ha följande installerat:

  • Microsoft SQL Server Native Client

  • MDAC 2.6 eller senare

I dessa exempel används mallar för att specificera XPath-frågor mot mapping XSD-schemat.

A. Begränsning av kundadresserna som returneras till en specifik adresstyp

I detta exempel innehåller en databas två tabeller:

  • Customer (CustomerID, CompanyName)

  • Adresser (KundID, Adresstyp, Gatuadress)

En kund kan ha en leveransadress och/eller en faktureringsadress. Kolumnvärdena för AddressType är Frakt och Fakturering.

Detta är mappningsschemat där attributet ShipTo-schemat mappas till kolumnen StreetAddress i relationen Address. De värden som returneras för detta attribut är begränsade till endast att leverera adresser genom att ange sql:limit-field och sql:limit-value-annotationerna . På liknande sätt returnerar BillTo-schemaattributet endast kundens faktureringsadress.

Detta är schemat:

<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>  
För att testa en exempel-XPath-fråga mot schemat
  1. Skapa två tabeller i tempdb-databasen :

    USE tempdb  
    CREATE TABLE Customer (CustomerID int primary key,   
                           CompanyName varchar(30))  
    CREATE TABLE Addresses(CustomerID int,   
                           StreetAddress varchar(50),  
                           AddressType varchar(10))  
    
  2. Lägg till exempeldata:

    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. Kopiera schemakoden ovan och klistra in den i en textfil. Spara filen som LimitFieldValue.xml.

  4. Skapa följande mall (LimitFieldValueT.xml) ) och spara den på samma sätt som du sparade schemat (LimitFieldValue.xml) i föregående steg:

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

    Den katalogväg som anges för mappningsschemat (LimitFieldValue.xml) är relativ till katalogen där mallen sparas. En absolut väg kan också specificeras, till exempel:

    mapping-schema="C:\MyDir\LimitFieldValue.xml"  
    
  5. Skapa och använd SQLXML 4.0 Test Script (Sqlxml4test.vbs) för att köra mallen.

    För mer information, se Användning av ADO för att köra SQLXML-frågor.

Det här är resultatet:

<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. Begränsningsresultat baserat på ett diskonteringsvärde av typen reella data

I detta exempel innehåller en databas två tabeller:

  • Order (OrderID)

  • Orderdetaljer (OrderID, ProduktID, Enhetspris, Mängd, Pris, Rabatt)

Detta är mappningsschemat där attributet OrderID på orderdetaljerna mappas till kolumnen OrderID i orderrelationen. De värden som returneras för detta attribut är begränsade till endast de som har värdet 2,0000000e-001 (0,2) enligt specificeringen för Discount-attributet med hjälp av sql:limit-field och sql:limit-value-annotationerna .

Detta är schemat:

<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>  
För att testa en exempel-XPath-fråga mot schemat
  1. Skapa två tabeller i tempdb-databasen :

    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. Lägg till exempeldata:

    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. Spara schemat (LimitFieldValue.xml) i en katalog.

  4. Skapa följande testskript (TestQuery.vbs), ändra MyServer till namnet på din SQL Server-dator och spara det i samma katalog som du använde i föregående steg för att spara schemat:

    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. Kör TestQuery.vbs-filen genom att klicka på den i Windows Utforskaren.

    Det här är resultatet:

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

Se även

float och real (Transact-SQL)
nchar och nvarchar (Transact-SQL)
Installera den interna SQL Server-klienten
Användning av annoterade XSD-scheman i frågor (SQLXML 4.0)