Udostępnij za pośrednictwem


Filtrowanie przy użyciu wartości sql:limit-pole i sql:limit-wartość (SQLXML 4.0)

Można ograniczyć wierszy zwracanych z kwerendy bazy danych w oparciu o niektóre wartości graniczne.sql:limit-field i sql:limit-value Adnotacje są używane do identyfikowania kolumna bazy danych, która zawiera wartości graniczne i określić określone wartości graniczne do filtrowania danych zwróconych.

sql:limit-field Adnotacji jest używany do identyfikowania kolumna zawierającej wartości graniczne; na każdym mapowany element lub atrybut jest dozwolony.

sql:limit-value Adnotacji jest używany do określenia ograniczoną wartość kolumna, która jest określona w sql:limit-field adnotacji.sql:limit-value Adnotacji jest opcjonalne.Jeśli sql:limit-value jest nie jest określony, jest przyjmowana wartość NULL.

Ostrzeżenie

Podczas pracy z sql:limit-field gdzie mapowanej kolumna SQL jest typu real, SQLXML 4.0 wykonuje konwersję na sql:limit-value jak określono w schematach XML jako nvarchar określonej wartości.To wymaga wartości dziesiętne limit określony przy użyciu pełnej notacji naukowej.Aby uzyskać więcej informacji zobacz przykład b poniżej.

Przykłady

Tworzenie próbki pracy przy użyciu tych przykładów, trzeba mieć zainstalowane następujące oprogramowanie:

  • Microsoft SQL Server Native Client

  • MDAC 2.6 lub nowszej

W tych przykładach szablony są używane do określenia kwerend XPath mapowanie schematu XSD.

A.Ograniczanie adresy nabywców zwracany typ określony adres

W tym przykładzie bazy danych zawiera dwie tabele:

  • Klienta (IDklienta, NazwaFirmy)

  • Adresy (IDklienta, AddressType, adres)

Klient może mieć adres wysyłkowy lub adres rozliczeniowy.Wartości kolumna AddressType wysyłki i fakturowania.

Jest to schemat mapowania, w którym miejsce dostawy Odwzorowuje atrybut schematu kolumna adres względem adresów.Wartości, które są zwracane dla tego atrybut są ograniczone do tylko adresy wysyłkowe określając sql:limit-field i sql:limit-value adnotacje.Podobnie Adres rachunku atrybut schematu zwraca adres rozliczeniowy klienta.

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

Aby przetestować przykładowe kwerendy XPath względem schematu

  1. Utwórz dwie tabele w tempdb bazy danych:

    USE tempdb
    CREATE TABLE Customer (CustomerID int primary key, 
                           CompanyName varchar(30))
    CREATE TABLE Addresses(CustomerID int, 
                           StreetAddress varchar(50),
                           AddressType varchar(10))
    
  2. Dodaj dane przykładowe:

    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. Kod schematu skopiować i wkleić go do pliku tekstowego.Zapisz plik jako LimitFieldValue.xml.

  4. Utwórz następujący szablon (LimitFieldValueT.xml) i zapisać go w tym samym zapisywania schematu (LimitFieldValue.xml) w poprzednim kroku:

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

    Ścieżka katalogu określonego dla mapowania schematu (LimitFieldValue.xml) jest katalog, w którym zapisany szablon.Ścieżka bezwzględna również można określić, na przykład:

    mapping-schema="C:\MyDir\LimitFieldValue.xml"
    
  5. Tworzenie i używanie szablon wykonać skryptu testu 4.0 SQLXML (Sqlxml4test.vbs).

    Aby uzyskać więcej informacji, zobacz Przy użyciu ADO do wykonywania kwerend SQLXML.

Jest to wynikiem:

<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.Ograniczanie wyniki na podstawie typu danych rzeczywistych wartości rabatu

W tym przykładzie bazy danych zawiera dwie tabele:

  • Zamówienia (IDZamówienia)

  • SzczegółyZamówień (IDZamówienia i IDProduktu CenaJednostkowa, ilości, ceny, rabatu)

Jest to schemat mapowania, w którym IDZamówienia mapowań atrybut na szczegóły zamówienia kolumna IDZamówienia w odniesieniu do zamówień.Wartości, które są zwracane dla tego atrybut są ograniczone do tylko te, które mają wartość 2.0000000e-001 (0,2) określoną dla rabatu atrybut za pomocą sql:limit-field i sql:limit-value adnotacje.

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

Aby przetestować przykładowe kwerendy XPath względem schematu

  1. Utwórz dwie tabele w tempdb bazy danych:

    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. Dodaj dane przykładowe:

    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. Zapisz schemat (LimitFieldValue.xml) w katalogu.

  4. Utwórz następujący skrypt testu (TestQuery.vbs), modyfikowanie MójSerwer nazwę na SQL Server komputer i zapisać go w tym samym katalogu, używany w poprzednim kroku, aby zapisać 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. Wykonywanie pliku TestQuery.vbs, klikając go w Eksploratorze Windows.

    Jest to wynikiem:

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