Udostępnij przez


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

Important noteImportant Note:

W tym temacie jest włączony jako odwołanie w przypadku starszych aplikacji.Żadna praca przyszłe będą mogły wykonać tej funkcji.Należy unikać stosowania tej funkcji w nowej pracy rozwoju.Zamiast tego należy używać adnotacjami schematów XSD tworzenia widoków XML.Aby uzyskać więcej informacji zobaczWprowadzenie do adnotacjami schematy XSD (SQLXML 4.0).Istniejące schematy XDR adnotacjami można przekonwertować schematów XSD.Aby uzyskać więcej informacji zobaczKonwertowanie adnotacjami schematy XDR Equivalent schematy XSD (SQLXML 4.0).

Istnieje możliwość ograniczenia wierszy zwracanych z kwerendy bazy danych na podstawie niektóre wartości graniczne.Adnotacje te są używane do identyfikowania kolumna bazy danych, która zawiera wartości graniczne i określić konkretną wartością graniczną ma być używana do filtrowania danych zwróconych.

The sql:limit-field annotation is used to identify a column that contains a limiting value.sql:limit-field is used to qualify the join relationship specified using <sql:relationship>.sql:limit-field must be used on an element or attribute that has <sql:relationship> specified.

The sql:limit-value annotation is used to specify the limited value in the kolumna specified in a sql:limit-field annotation. Ta adnotacja jest opcjonalne.Jeśli sql:limit-value to nie jest określona, jest przyjmowana wartość null.

Uwaga

Podczas pracy z sql:limit-field w przypadku gdy mapowane SQL kolumna jest typu float and real (Transact-SQL)SQLXML 4.0 wykonuje konwersję na sql:limit-value jak określono w schematach XML jako nchar i nvarchar (języka Transact-SQL) 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 poniższych przykładach, musi spełniać określone wymagania.Aby uzyskać więcej informacji zobaczWymagania dotyczące uruchamianie SQLXML przykłady.

A.Ograniczenia adresów klientów, zwracany typ określony adres

W tym przykładzie baza danych zawiera dwie tabele:

  • Klienta (IDklienta, CompanyName)

  • Adresy (identyfikator klienta, AddressType, StreetAddress)

Klient może mieć wysyłki i/lub adres bilingowy (wartości kolumn AddressType są dostawy i fakturowanie).

Jest to schemat mapowania, w którym ShipTo atrybut schematu mapuje StreetAddress kolumna w odniesieniu do adresów.Wartości zwracane dla tego atrybut są ograniczone do tylko dostawy adresów przez podanie sql:limit-field i sql:limit-value adnotacje. Podobnie BillTo atrybut schematu zwraca tylko adres faktury odbiorcy.

Jest to schemat:

<?xml version="1.0" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
        xmlns:dt="urn:schemas-microsoft-com:datatypes"
        xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<ElementType name="Customer" sql:relation="Customer" >
    <AttributeType name="CustomerID" />
    <AttributeType name="CompanyName" />
    <AttributeType name="BillTo" />
    <AttributeType name="ShipTo" />

    <attribute type="CustomerID" />
    <attribute type="CompanyName" />
    <attribute type="BillTo" 
                sql:limit-field="AddressType"
                sql:limit-value="billing"
                sql:field="StreetAddress"
                sql:relation="Addresses" >
                <sql:relationship 
                        key="CustomerID"
                        key-relation="Customer"
                       foreign-relation="Addresses"
                       foreign-key="CustomerID" />
    </attribute>
    <attribute type="ShipTo" 
                sql:limit-field="AddressType"
                sql:limit-value="shipping"
                sql:field="StreetAddress"
                sql:relation="Addresses" >
                <sql:relationship 
                     key="CustomerID"
                     key-relation="Customer"
                     foreign-relation="Addresses"
                     foreign-key="CustomerID" />
    </attribute>
</ElementType>
</Schema>

Aby przetestować kwerendę XPath próbki względem schematu

  1. Utwórz następujące dwie tabele w bazie danych 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. 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 2222Mé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 LimitFieldValueXdr.xml.

  4. Skopiuj następujący szablon i wkleić go do pliku tekstowego.Zapisz plik jako LimitFieldValueXdrT.xml w tym samym katalogu, w którym zapisano LimitFieldValueXdr.xml.Kwerendy w szablonie wybiera wszystkie rekordy z tabela Nabywca.

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

    To ścieżka do katalogu określonego dla mapowania schematu (LimitFieldValueXdr.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\LimitFieldValueXdr.xml"
    
  5. Tworzenie i używanie skryptu testu 4.0 SQLXML (Sqlxml4test.vbs) do wykonać tego szablonu.

    Aby uzyskać więcej informacji zobaczPrzy użyciu obiektu ADO do wykonywania SQLXML bada 4.0.

Poniżej znajduje się zestaw wyników:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> 
  <Customer CustomerID="1" CompanyName="Company A" 
          BillTo="Obere Str. 57 Berlin" 
          ShipTo="Avda. de la Constitución 2222México D.F." /> 
  <Customer CustomerID="2" CompanyName="Company B" 
          BillTo="120 Hanover Sq., London" 
          ShipTo="Forsterstr. 57, Mannheim" /> 
</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órych atrybut IDZamówienia na szczegóły zamówienia mapuje kolumna Identyfikator zamówienia w odniesieniu do zamówienia.Wartości, które są zwracane dla tego atrybut są ograniczone do tylko tych, które mają wartość 2.0000000e-001 (0,2) określony za pomocą atrybut rabat sql:limit-field i sql:limit-value adnotacje.

Jest to schemat:

<?xml version="1.0" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
xmlns:dt="urn:schemas-microsoft-com:datatypes"
xmlns:sql="urn:schemas-microsoft-com:xml-sql">

  <ElementType name="root" sql:is-constant="1">
    <element type="Order"/>
  </ElementType>

  <ElementType name="orderDetail" sql:relation="OrderDetails">
     <AttributeType name="OrderID" />
     <AttributeType name="ProductID" />
     <AttributeType name="Discount" />
     <AttributeType name="Quantity" />
     <attribute type="OrderID" />
     <attribute type="ProductID" />
     <attribute type="Discount" />
     <attribute type="Quantity" />
  </ElementType>

  <ElementType name="Order" sql:relation="Orders">
     <AttributeType name="OrderID"/>
     <attribute type="OrderID"/>
     <element type="orderDetail"  
              sql:limit-field="Discount" 
              sql:limit-value="2.0000000e-001">
        <sql:relationship key="OrderID"
                          key-relation="Orders"
                          foreign-relation="OrderDetails"
                          foreign-key="OrderID"/>
     </element>
  </ElementType>

</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}"
    'DBGUID_MSSQLXML = "{5d531cb2-e6ed-11d2-b252-00c04f681b71}"
    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>