Sdílet prostřednictvím


Filtrování hodnot pomocí sql:limit-field a sql:limit-value (SQLXML 4.0)

platí pro:SQL Serverazure SQL Database

Můžete omezit řádky, které jsou vráceny z databázového dotazu, na základě nějaké limitní hodnoty. Pole sql:limit-field a sql:limit-value se používají k identifikaci sloupce databáze obsahujícího limitující hodnoty a k určení konkrétní limitní hodnoty, která se použije k filtrování vrácených dat.

Anotace sql:limit-field se používá k identifikaci sloupce, který obsahuje limitní hodnotu; je povolena na každém zobrazeném prvku nebo atributu.

Anotace sql:limit-value se používá k určení omezené hodnoty ve sloupci, která je specifikována v anotaci sql:limit-field . Anotace sql:limit-value je volitelná. Pokud není specifikována hodnota sql:limit, předpokládá se hodnota NULL.

Poznámka:

Při práci s polem sql:limit, kde je namapovaný sloupec SQL typu real, provádí SQLXML 4.0 konverzi na hodnotu sql:limit , jak je specifikována ve schématech XML, jako hodnotu specifikovanou nvarcharem . To vyžaduje, aby desetinné limitní hodnoty byly specifikovány pomocí plné vědecké notace. Pro více informací viz Příklad B níže.

Examples

Pro vytvoření pracovních vzorků pomocí těchto příkladů je potřeba mít nainstalované následující:

  • Nativní klient Microsoft SQL Serveru

  • MDAC 2.6 nebo novější

V těchto příkladech se šablony používají ke specifikaci dotazů XPath vůči schématu mapování XSD.

A. Omezení počtu adres, které se vracejí na konkrétní typ adresy

V tomto příkladu databáze obsahuje dvě tabulky:

  • Zákazník (CustomerID, CompanyName)

  • Adresy (CustomerID, AddressType, StreetAddress)

Zákazník může mít doručovací adresu a/nebo fakturační adresu. Hodnoty sloupců AddressType jsou Shipping a Billing.

Toto je mapovací schéma, ve kterém atribut schématu ShipTo mapuje na sloupec StreetAddress ve vztahu Adresy. Hodnoty vrácené pro tento atribut jsou omezeny pouze na doručovací adresy specifikací polí sql:limit-a a sql:limit-value . Podobně atribut schématu BillTo vrací pouze fakturační adresu zákazníka.

Toto je schéma:

<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>  
Pro testování vzorku dotazu XPath proti schématu
  1. Vytvořte dvě tabulky v databázi 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. Přidejte ukázková data:

    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. Zkopírujte výše uvedený kód schématu a vložte ho do textového souboru. Uložte soubor jako LimitFieldValue.xml.

  4. Vytvořte následující šablonu (LimitFieldValueT.xml) a uložite ji tam, kde jste uložili schéma (LimitFieldValue.xml) v předchozím kroku:

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

    Adresářová cesta určená pro mapovací schéma (LimitFieldValue.xml) je relativní k adresáři, ve kterém je šablona uložena. Absolutní cestu lze také specifikovat, například:

    mapping-schema="C:\MyDir\LimitFieldValue.xml"  
    
  5. Vytvořte a použijte testovací skript SQLXML 4.0 (Sqlxml4test.vbs) k provedení šablony.

    Pro více informací viz Použití ADO pro provádění dotazů SQLXML.

Toto je výsledek:

<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. Omezení výsledků na základě diskontní hodnoty reálných dat typu

V tomto příkladu databáze obsahuje dvě tabulky:

  • Příkazy (OrderID)

  • ObjednávkaDetaily (OrderID, ProductID, UnitPrice, Quantity, Price, Discount)

Toto je mapovací schéma, ve kterém atribut OrderID v detailech objednávky mapuje na sloupec OrderID ve vztahu příkazů. Hodnoty vrácené pro tento atribut jsou omezeny pouze na ty, které mají hodnotu 2.0000000e-001 (0.2), jak je specifikováno pro atribut Discount pomocí anotací sql:limit-field a sql:limit-value .

Toto je schéma:

<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>  
Pro testování vzorku dotazu XPath proti schématu
  1. Vytvořte dvě tabulky v databázi 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. Přidejte ukázková data:

    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. Uložte schéma (LimitFieldValue.xml) do adresáře.

  4. Vytvořte následující testovací skript (TestQuery.vbs), upravte MyServer na název vašeho SQL Server počítače a uložte ho do stejného adresáře, kde jste použili v předchozím kroku pro uložení schématu:

    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. Spusť soubor TestQuery.vbs kliknutím v Průzkumníku Windows.

    Toto je výsledek:

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

Viz také

float a real (Transact-SQL)
nchar a nvarchar (Transact-SQL)
Instalace nativního klienta SQL Serveru
Použití anotovaných XSD schémat v dotazech (SQLXML 4.0)