Freigeben über


Filtern von Werten mit 'sql:limit-field' und 'sql:limit-value' (XDR-Schema)

Wichtiger HinweisWichtig

Dieses Thema ist als Referenz für ältere Anwendungen enthalten. Für dieses Feature wird künftig keine Entwicklungsarbeit mehr geleistet. Vermeiden Sie daher das Verwenden dieses Features bei neuen Entwicklungsarbeiten. Verwenden Sie stattdessen XSD-Schemas mit Anmerkungen zum Erstellen von XML-Sichten. Weitere Informationen finden Sie unter Einführung in XSD-Schemas mit Anmerkungen (SQLXML 4.0). Sie können vorhandene XDR-Schemas mit Anmerkungen in XSD-Schemas konvertieren. Weitere Informationen finden Sie unter Konvertieren von XDR-Schemas mit Anmerkungen in gleichbedeutende XSD-Schemas (SQLXML 4.0).

Sie können Zeilen, die von einer Datenbankabfrage zurückgegeben werden, mit einem Grenzwert begrenzen. Mithilfe der Anmerkungen können Sie die Datenbankspalte, die die Grenzwerte enthält, identifizieren und einen bestimmten Grenzwert angeben, der zum Filtern der zurückgegebenen Daten verwendet werden soll.

Mithilfe der sql:limit-field-Anmerkung können Sie eine Spalte identifizieren, die einen Grenzwert enthält. Mithilfe von sql:limit-field können Sie die mithilfe von <sql:relationship> angegebene Verknüpfungsbeziehung bestimmen. sql:limit-field muss in einem Element oder Attribut mit angegebenem <sql:relationship> verwendet werden.

Mithilfe der sql:limit-value-Anmerkung wird der Grenzwert in der Spalte angegeben, die in einer sql:limit-field-Anmerkung angegeben ist. Diese Anmerkung ist optional. Wenn sql:limit-value nicht angegeben wird, wird ein NULL-Wert verwendet.

HinweisHinweis

Bei Verwendung einer sql:limit-field-Anmerkung, bei der die zugeordnete SQL-Spalte eine Spalte vom Typ float und real (Transact-SQL) ist, konvertiert SQLXML 4.0 die sql:limit-value-Anmerkung wie in XML-Schemas angegeben in einen angegebenen nchar und nvarchar (Transact-SQL)-Wert. Hierzu müssen Dezimalgrenzwerte mithilfe der vollständigen wissenschaftlichen Schreibweise angegeben werden. Weitere Informationen finden Sie im Folgenden unter Beispiel B.

Beispiele

Es müssen bestimmte Anforderungen erfüllt sein, damit aus den folgenden Beispielen funktionierende Beispiele erstellt werden können. Weitere Informationen finden Sie unter Anforderungen zum Ausführen von SQLXML-Beispielen.

A. Beschränken der zurückgegebenen Kundenadressen auf einen bestimmten Adresstyp

In diesem Beispiel enthält eine Datenbank zwei Tabellen:

  • Customer (CustomerID, CompanyName)

  • Addresses (CustomerID, AddressType, StreetAddress)

Ein Kunde kann eine Liefer- und/oder eine Rechnungsadresse haben (die Werte der AddressType-Spalte lauten Shipping und Billing).

Hierbei handelt es sich um das Zuordnungsschema, in dem das ShipTo-Schemaattribut der StreetAddress-Spalte in der Addresses-Beziehung zugeordnet wird. Die für dieses Attribut zurückgegebenen Werte werden durch die Angabe der Anmerkungen sql:limit-field und sql:limit-value auf Lieferadressen begrenzt. Entsprechend gibt das BillTo-Schemaattribut nur die Rechnungsadresse eines Kunden zurück.

Das ist das Schema:

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

So testen Sie eine XPath-Beispielabfrage mit dem Schema

  1. Erstellen Sie die folgenden beiden Tabellen in der tempdb-Datenbank:

    USE tempdb
    CREATE TABLE Customer (CustomerID int primary key, 
                           CompanyName varchar(30))
    CREATE TABLE Addresses(CustomerID int, 
                           StreetAddress varchar(50),
                           AddressType varchar(10))
    
  2. Fügen Sie die Beispieldaten hinzu:

    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. Kopieren Sie den oben stehenden Schemacode, und fügen Sie ihn in eine Textdatei ein. Speichern Sie die Datei unter dem Dateinamen LimitFieldValueXdr.xml .

  4. Kopieren Sie die folgende Vorlage, und fügen Sie sie in eine Textdatei ein. Speichern Sie die Datei unter dem Namen LimitFieldValueXdrT.xml im selben Verzeichnis, in dem Sie LimitFieldValueXdr.xml gespeichert haben. Die Abfrage in der Vorlage wählt alle Datensätze in der Customer-Tabelle aus.

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

    Der für das Zuordnungsschema (LimitFieldValueXdr.xml) angegebene Verzeichnispfad bezieht sich auf das Verzeichnis, in dem die Vorlage gespeichert wird. Es kann auch ein absoluter Pfad angegeben werden. Beispiel:

    mapping-schema="C:\MyDir\LimitFieldValueXdr.xml"
    
  5. Erstellen und verwenden Sie das SQLXML 4.0-Testskript (Sqlxml4test.vbs), um die Vorlage auszuführen.

    Weitere Informationen finden Sie unter Verwenden von ADO zum Ausführen von SQLXML 4.0-Abfragen.

Im Folgenden wird das Resultset aufgeführt:

<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. Beschränken von Ergebnissen anhand eines Rabattwerts vom Datentyp 'real'

In diesem Beispiel enthält eine Datenbank zwei Tabellen:

  • Orders (OrderID)

  • OrderDetails (OrderID, ProductID, UnitPrice, Quantity, Price, Discount)

Hierbei handelt es sich um das Zuordnungsschema, in dem das OrderID-Attribut in den Bestellungsdetails der OrderID-Spalte in der Orders-Beziehung zugeordnet wird. Die für dieses Attribut zurückgegebenen Werte werden durch die Angabe der Anmerkungen sql:limit-field und sql:limit-value auf die Werte begrenzt, die für das Discount-Attribut den Wert 2,0000000e-001 (0,2) angeben.

Das ist das Schema:

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

So testen Sie eine XPath-Beispielabfrage mit dem Schema

  1. Erstellen Sie in der Datenbank tempdb zwei Tabellen:

    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. Fügen Sie die Beispieldaten hinzu:

    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. Speichern Sie das Schema (LimitFieldValue.xml) in einem Verzeichnis.

  4. Erstellen Sie das folgende Testskript (TestQuery.vbs), geben Sie anstelle von MyServer den Namen des SQL Server-Computers ein, und speichern Sie das Skript in dem Verzeichnis, in dem Sie im vorherigen Schritt das Schema gespeichert haben:

    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. Führen Sie die Datei TestQuery.vbs aus, indem Sie in Windows Explorer auf die Datei klicken.

    Dies ist das Ergebnis:

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