Freigeben über


Identifizieren von Schlüsselspalten mit sql:key-Feldern (XDR-Schema)

Wichtiger HinweisWichtig

Dieses Thema ist als Referenz für ältere Anwendungen enthalten. Für diese Funktion wird künftig keine Entwicklungsarbeit mehr geleistet. Vermeiden Sie daher das Verwenden dieser Funktion 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).

Wenn eine XQuery-Abfrage mit einem XSD-Schema angegeben wird, sind in den meisten Fällen Schlüsselangaben erforderlich, damit das Ergebnis richtig geschachtelt wird. Durch die Angabe der sql:key-fields-Anmerkung lässt sich sicherstellen, dass die entsprechende Hierarchie generiert wird.

HinweisHinweis

Um die richtige Schachtelung im Ergebnis zu erzeugen, wird die Angabe von sql:key-fields in allen Schemas empfohlen.

In vielen Fällen ist ein Verständnis der Art und Weise erforderlich, wie die Zeilen einer Tabelle eindeutig identifiziert werden, um die geeignete XML-Hierarchie erzeugen zu können. Durch Hinzufügen der sql:key-fields-Anmerkung zu <element> und <ElementType> können die Spalten angegeben werden, welche die Zeilen der Tabelle eindeutig identifizieren.

Der Wert von sql:key-fields identifiziert die Spalte(n), welche die Zeilen in der mit <ElementType> angegebenen Beziehung eindeutig identifiziert bzw. identifizieren. Wenn mehrere Spalten zur eindeutigen Identifizierung einer Zeile erforderlich sind, werden die Spaltenwerte jeweils durch einen Leerraum voneinander getrennt aufgeführt.

Die sql:key-fields-Anmerkung muss in einem Element angegeben werden, das ein untergeordnetes Element und ein <sql:relationship>-Element enthält, welches eine Beziehung zwischen dem Element und dem untergeordneten Element definiert, das nicht den Primärschlüssel der im übergeordneten Element angegebenen Tabelle bereitstellt.

Beispiele

Bestimmte Anforderungen müssen erfüllt werden, um aus den folgenden Beispielen funktionierende Codebeispiele zu erstellen. Weitere Informationen finden Sie unter Anforderungen zum Ausführen von SQLXML-Beispielen.

A. Erzeugen der entsprechenden Schachtelung, wenn <sql:relationship> keine ausreichenden Informationen bereitstellt

Dieses Beispiel zeigt, wo sql:key-fields angegeben werden muss.

Betrachten Sie folgendes Schema. Das Schema gibt die hierarchische Beziehung zwischen dem <Order>-Element und dem <Customer>-Elements an, in der das <Order>-Element das übergeordnete Element und das <Customer>-Element ein untergeordnetes Element ist.

Die Parent-Child-Beziehung wird mit dem <sql:relationship>-Tag angegeben. Im <sql:relationship>-Tag wird CustomerID durch die Angabe von foreign-key als Fremdschlüssel in der Sales.SalesOrderHeader-Tabelle bezeichnet, der auf die CustomerID-Schlüsselspalte in der Sales.Customer-Tabelle verweist. Diese in <sql:relationship> bereitgestellten Informationen reichen nicht aus, um Zeilen der übergeordnete Tabelle (Sales.SalesOrderHeader) eindeutig zu identifizieren. Deshalb wird die Hierarchie ohne Angabe von sql:key-fields nicht ordnungsgemäß erzeugt.

Wenn sql:key-fields für <Order> angegeben wird, identifiziert die Anmerkung die Zeilen im übergeordneten Element (Sales.SalesOrderHeader-Tabelle) eindeutig, und die untergeordneten Elemente werden jeweils unter dem zugehörigen übergeordneten Element ausgegeben.

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="Sales.Customer">
    <AttributeType name="CustomerID" />
    <attribute type="CustomerID" />
  </ElementType>

  <ElementType name="Order" sql:relation="Sales.SalesOrderHeader" 
                            sql:key-fields="SalesOrderID" >
    <AttributeType name="SalesOrderID" />
    <AttributeType name="CustomerID" />
 
    <attribute type="SalesOrderID" />
    <attribute type="CustomerID" />
    <element type="Customer" >
             <sql:relationship
                         key-relation="Sales.SalesOrderHeader"
                         key="CustomerID"
                         foreign-relation="Sales.Customer"
                         foreign-key="CustomerID" />
    </element>
     </ElementType>
</Schema>

So testen Sie ein funktionstüchtiges Beispiel für dieses Schema

  1. Kopieren Sie den oben stehenden Schemacode, und fügen Sie ihn in eine Textdatei ein. Speichern Sie die Datei unter dem Dateinamen KeyFieldsA-Xdr.xml.

  2. Kopieren Sie die folgende Vorlage, und fügen Sie sie in eine Textdatei ein. Speichern Sie die Datei unter dem Namen KeyFieldsA-XdrT.xml im gleichen Verzeichnis, in dem Sie KeyFieldsA-Xdr.xml gespeichert haben.

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

    Der für das Zuordnungsschema (KeyFieldsA-Xdr.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\KeyFieldsA-Xdr.xml"
    
  3. 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">
  <Order SalesOrderID="43659" CustomerID="676">
    <Customer CustomerID="676" /> 
  </Order>
  <Order SalesOrderID="43660" CustomerID="117">
    <Customer CustomerID="117" /> 
  </Order>
  <Order SalesOrderID="43661" CustomerID="442">
    <Customer CustomerID="442" /> 
  </Order>
  ...
</ROOT>

B. Angeben der "sql:key"-Felder, um die richtige Schachtelung im Ergebnis zu erzeugen

In diesem Schema gibt es keine durch <sql:relationship> festgelegte Hierarchie. Das Schema erfordert trotzdem die sql:key-fields-Anmerkung, die angegeben wird, um Mitarbeiter in der Tabelle HumanResources.Employee eindeutig zu identifizieren.

<?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="Title" content="textOnly"  >
      <AttributeType name="BusinessEntityID" />
      <attribute type="BusinessEntityID" />
   </ElementType>

   <ElementType name="HumanResources.Employee" sql:key-fields="BusinessEntityID" >
      <element type="JobTitle" />
   </ElementType>
</Schema>

So testen Sie ein funktionstüchtiges Beispiel für dieses Schema

  1. Kopieren Sie den oben stehenden Schemacode, und fügen Sie ihn in eine Textdatei ein. Speichern Sie die Datei unter dem Dateinamen KeyFieldsB-Xdr.xml.

  2. Kopieren Sie die folgende Vorlage, und fügen Sie sie in eine Textdatei ein. Speichern Sie die Datei unter dem Namen KeyFieldsB-XdrT.xml im gleichen Verzeichnis, in dem Sie KeyFieldsB-Xdr.xml gespeichert haben. Die XPath-Abfrage in der Vorlage gibt alle <Order>-Elemente zurück.

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
      <sql:xpath-query mapping-schema="KeyFieldsB-Xdr.xml">
        /HumanResources.Employee
      </sql:xpath-query>
    </ROOT>
    

    Der für das Zuordnungsschema (KeyFieldsB-Xdr.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\KeyFieldsB-Xdr.xml"
    
  3. 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.

Ein Teil des Resultsets ist unten abgebildet:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
  <HumanResources.Employee>
    <Title BusinessEntityID="1">Production Technician - WC60</Title> 
  </HumanResources.Employee>
  <HumanResources.Employee>
    <Title BusinessEntityID="2">Marketing Assistant</Title> 
  </HumanResources.Employee>
  <HumanResources.Employee>
    <Title BusinessEntityID="3">Engineering Manager</Title> 
  </HumanResources.Employee>
   ...
</ROOT>