Udostępnij przez


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

Można ograniczyć wiersze, które są zwracane z zapytania do bazy danych w oparciu o pewne wartości graniczne.The sql:limit-field and sql:limit-value annotations are used to identify the database kolumna that contains limiting values and to specify a specific limiting value to be used to filter the data returned.

The sql:limit-field annotation is used to identify a kolumna that contains a limiting value; it is allowed on each mapped element or atrybut.

The sql:limit-value annotation is used to specify the limited value in the kolumna that is specified in the sql:limit-field annotation. The sql:limit-value annotation is optional.Jeśli sql:limit-value to nie jest określony, jest przyjmowana wartość NULL.

Uwaga

Podczas pracy z sql:limit-field w przypadku gdy mapowane SQL kolumna jest typu realSQLXML 4.0 wykonuje konwersję na sql:limit-value jak określono w schematach XML jako nvarchar Określona wartość. To wymaga wartości dziesiętne limit określony przy użyciu pełnego zapisu naukowego.Aby uzyskać więcej informacji zobacz temat B przykład poniżej.

Przykłady

Aby utworzyć próbek pracy przy użyciu tych przykładów, należy mieć zainstalowane następujące elementy:

  • Microsoft SQL Server Macierzysta klient

  • Składniki MDAC 2.6 lub nowszej

W tych przykładach szablony są używane do określania kwerend XPath względem schematu XSD mapowania.

A.Ograniczenia adresów klientów zwracane do typu określonego adresu

W tym przykładzie baza danych zawiera dwie tabele:

  • Klienta (IDklienta, CompanyName)

  • Adresy (identyfikator klienta, AddressType, StreetAddress)

Klient może mieć adres wysyłkowy lub adres rozliczeniowy.Wartości kolumna AddressType są dostawy i faktury.

Jest to schemat mapowania, w którym ShipTo atrybut schematu jest mapowany na kolumnie StreetAddress w odniesieniu do adresów.Wartości, które są zwracane dla tego atrybut są ograniczone do tylko wysyłki adresów przez podanie sql:limit-field i sql:limit-value adnotacje. Podobnie BillTo atrybut schematu zwraca tylko adres bilingowy 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ć kwerendę XPath próbki 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. Skopiować powyższy kod schematu i wkleić go do pliku tekstowego.Zapisz plik jako LimitFieldValue.xml.

  4. Utwórz następujący szablon (LimitFieldValueT.xml), a następnie zapisz go w taki sam, której schematu (LimitFieldValue.xml) został zapisany w poprzednim kroku:

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

    To ścieżka do katalogu określonego dla mapowania schematu (LimitFieldValue.xml) jest względna w stosunku do katalogu, w którym są zapisywane w szablonie.Ścieżka bezwzględna również można określić, na przykład:

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

    Aby uzyskać więcej informacji zobacz Przy użyciu obiektu ADO w celu wykonać kwerendy SQLXML.

Oto wynik:

<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 baza danych zawiera dwie tabele:

  • Zamówienia (identyfikator zamówienia)

  • SzczegółyZamówienia (IDZamówienia i IDProduktu CenaJednostkowa, ilość, cena, rabat)

Jest to schemat mapowania, w którym Identyfikator zamówienia atrybut szczegóły zamówienia jest mapowany do kolumna Identyfikator zamówienia w odniesieniu do zamówienia.Wartości, które są zwracane dla tego atrybutu są ograniczone do tylko tych, które mają wartość 2.0000000e-001 (0,2) określony dla Rabat atrybut używającsql: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ć kwerendę XPath próbki 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. Zapisywanie schematu (LimitFieldValue.xml) w katalogu.

  4. Utwórz następujący skrypt testu (TestQuery.vbs), zmodyfikować MójSerwer na nazwę tego komputera z programem SQL Server i zapisać go w tym samym katalogu, używany w poprzednim kroku w celu zapisania schematu:

    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. wykonać pliku TestQuery.vbs przez kliknięcie jej w Eksploratorze Windows.

    Oto wynik:

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