Teilen über


Identifizieren von Schlüsselspalten mithilfe von sql:key-Feldern (SQLXML 4.0)

Gilt für: SQL Server Azure SQL-Datenbank

Wenn eine XPath-Abfrage für ein XSD-Schema angegeben wird, sind wichtige Informationen in den meisten Fällen erforderlich, um die richtige Schachtelung im Ergebnis zu erhalten. Die Angabe der Anmerkung "sql:key-fields " ist eine Möglichkeit, sicherzustellen, dass die entsprechende Hierarchie generiert wird.

Hinweis

Um eine ordnungsgemäße Schachtelung sicherzustellen, wird empfohlen, sql:key-fields für Elemente anzugeben, die Tabellen zugeordnet sind. Das erzeugte XML wird durch die Anordnung des zugrunde liegenden Resultsets beeinflusst. Wenn sql:key-fields nicht angegeben ist, wird der generierte XML-Code möglicherweise nicht ordnungsgemäß gebildet.

Der Wert von sql:key-fields identifiziert die Spalten, die die Zeilen in der Beziehung eindeutig identifizieren. Wenn mehrere Spalten zur eindeutigen Identifizierung einer Zeile erforderlich sind, werden die Spaltenwerte jeweils durch ein Leerzeichen voneinander getrennt.

Sie müssen die Anmerkung "sql:key-fields " verwenden, wenn ein Element eine <sql:relationship> enthält, die zwischen dem Element und einem untergeordneten Element definiert ist, aber nicht den Primärschlüssel der Tabelle bereitstellt, die im übergeordneten Element angegeben ist.

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 für das Ausführen von SQLXML-Beispielen.

A. Erstellen der geeigneten Schachtelung, wenn <sql:relationship> keine ausreichenden Informationen bereitstellt

In diesem Beispiel wird gezeigt, wo sql:key-fields angegeben werden müssen.

Betrachten Sie folgendes Schema. Das Schema gibt eine Hierarchie zwischen den <Elementen Order> und <Customer> an, in denen das< Order-Element> das übergeordnete Element und das< Customer-Element> ein untergeordnetes Element ist.

Das <sql:relationship-Tag> wird verwendet, um die Beziehung zwischen übergeordneten und untergeordneten Elementen anzugeben. In diesem Tag wird CustomerID als übergeordneter Schlüssel identifiziert, der auf die untergeordnete CustomerID-Schlüsselspalte in der Sales.Customer-Tabelle verweist. Die in <sql:relationship> bereitgestellten Informationen reichen nicht aus, um Zeilen in der übergeordneten Tabelle (Sales.SalesOrderHeader) eindeutig zu identifizieren. Daher ist die generierte Hierarchie ohne die Anmerkung "sql:key-fields " ungenau.

Wenn sql:key-fields specified on <Order>, the annotation uniquely identifies the rows in the parent (Sales.SalesOrderHeader table) and its child elements appear below its parent.

Das ist das Schema:

<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="OrdCust"  
        parent="Sales.SalesOrderHeader"  
        parent-key="CustomerID"  
        child="Sales.Customer"  
        child-key="CustomerID" />  
  </xsd:appinfo>  
</xsd:annotation>  
  <xsd:element name="Order" sql:relation="Sales.SalesOrderHeader"   
               sql:key-fields="SalesOrderID">  
   <xsd:complexType>  
     <xsd:sequence>  
     <xsd:element name="Customer" sql:relation="Sales.Customer"   
                       sql:relationship="OrdCust"  >  
       <xsd:complexType>  
         <xsd:attribute name="CustID" sql:field="CustomerID" />  
         <xsd:attribute name="SoldBy" sql:field="SalesPersonID" />  
       </xsd:complexType>  
     </xsd:element>  
     </xsd:sequence>  
     <xsd:attribute name="SalesOrderID" type="xsd:integer" />  
     <xsd:attribute name= "CustomerID" type="xsd:string" />  
    </xsd:complexType>  
  </xsd:element>  
</xsd:schema>  
So erstellen 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 KeyFields1.xml.

  2. Kopieren Sie die folgende Vorlage, und fügen Sie sie in eine Textdatei ein. Speichern Sie die Datei unter dem Namen KeyFields1T.xml im gleichen Verzeichnis, in dem Sie KeyFields1.xml gespeichert haben. Die XPath-Abfrage in der Vorlage gibt alle <Order-Elemente> mit einer CustomerID von weniger als 3 zurück.

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
        <sql:xpath-query mapping-schema="KeyFields1.xml">  
            /Order[@CustomerID < 3]  
        </sql:xpath-query>  
    </ROOT>  
    

    Der für das Zuordnungsschema (KeyFields1.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\KeyFields1.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-Abfragen.

Im Folgenden wird ein Teil des Resultsets aufgeführt:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
    <Order SalesOrderID="43860" CustomerID="1">  
       <Customer CustID="1" SoldBy="280"/>  
    </Order>  
    <Order SalesOrderID="44501" CustomerID="1">  
       <Customer CustID="1" SoldBy="280"/>  
    </Order>  
    <Order SalesOrderID="45283" CustomerID="1">  
       <Customer CustID="1" SoldBy="280"/>  
    </Order>  
    .....  
</ROOT>  

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

Im folgenden Schema ist keine Hierarchie mit <sql:relationship> angegeben. Das Schema erfordert weiterhin die Angabe der sql:key-fields-Anmerkung , um Mitarbeiter in der Tabelle "HumanResources.Employee" eindeutig zu identifizieren.

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"  
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema">  
  <xsd:element name="HumanResources.Employee" sql:key-fields="EmployeeID" >  
   <xsd:complexType>  
     <xsd:sequence>  
        <xsd:element name="Title">  
          <xsd:complexType>  
            <xsd:simpleContent>  
              <xsd:extension base="xsd:string">  
                 <xsd:attribute name="EmployeeID" type="xsd:integer" />  
              </xsd:extension>  
            </xsd:simpleContent>  
          </xsd:complexType>  
        </xsd:element>  
     </xsd:sequence>  
   </xsd:complexType>  
  </xsd:element>  
</xsd:schema>  
So erstellen 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 KeyFields2.xml.

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

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

    Der für das Zuordnungsschema (KeyFields2.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\KeyFields2.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-Abfragen.

Dies ist das Ergebnis:

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