Identifiering av nyckelkolumner med sql:key-fields (SQLXML 4.0)

gäller för:SQL ServerAzure SQL Database

När en XPath-fråga specificeras mot ett XSD-schema krävs nyckelinformation i de flesta fall för att uppnå korrekt inbäddning i resultatet. Att specificera sql:key-fields-annotationen är ett sätt att säkerställa att rätt hierarki genereras.

Anmärkning

För att säkerställa korrekt inbäddning rekommenderas det att du anger sql:key-fields för element som mappas till tabeller. Den XML som produceras är känslig för ordningen av den underliggande resultatmängden. Om sql:key-fields inte specificeras kan den genererade XML:en vara felaktig i format.

Värdet sql :key-fields identifierar kolumnen/kolumnerna som unikt identifierar raderna i relationen. Om mer än en kolumn krävs för att entydigt identifiera en rad avgränsas kolumnvärdena av mellanslag.

Du måste använda sql:key-fields-annotationen när ett element innehåller en <sql:relation> som definieras mellan elementet och ett barnelement men inte tillhandahåller primärnyckeln för tabellen som anges i föräldraelementet.

Examples

För att skapa arbetsprover med hjälp av följande exempel måste du uppfylla vissa krav. För mer information, se Krav för att köra SQLXML-exempel.

A. Att skapa lämplig inbäddning när <sql:relationship> inte ger tillräcklig information

Detta exempel visar var sql:key-fields måste specificeras.

Betrakta följande schema. Schemat specificerar en hierarki mellan <Order>- och <Customer-elementen> där Order-elementet <> är föräldern och Customer-elementet <> är ett barn.

Taggen< sql:relationship-taggen> används för att specificera förälder-barn-relationen. Den identifierar CustomerID i tabellen Sales.SalesOrderHeader som föräldranyckeln som refererar till CustomerID-barnnyckeln i tabellen Sales.Customer. Informationen som ges i <sql:relationship> är inte tillräcklig för att unikt identifiera rader i modertabellen (Sales.SalesOrderHeader). Därför är den genererade hierarkin utan sql:key-fields-annotationen felaktig.

Med sql:key-fields specificerade i <Order> identifierar annotationen entydigt raderna i föräldern (Sales.SalesOrderHeader-tabellen), och dess underordnade element visas under föräldern.

Detta är 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="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>  
För att skapa ett fungerande exempel av detta schema
  1. Kopiera schemakoden ovan och klistra in den i en textfil. Spara filen som KeyFields1.xml.

  2. Kopiera följande mall och klistra in den i en textfil. Spara filen som KeyFields1T.xml i samma katalog där du sparade KeyFields1.xml. XPath-frågan i mallen returnerar alla <orderelement> med ett CustomerID mindre än 3.

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

    Den katalogväg som anges för mappningsschemat (KeyFields1.xml) är relativ till katalogen där mallen sparas. En absolut väg kan också specificeras, till exempel:

    mapping-schema="C:\MyDir\KeyFields1.xml"  
    
  3. Skapa och använd SQLXML 4.0 Test Script (Sqlxml4test.vbs) för att köra mallen.

    För mer information, se Användning av ADO för att köra SQLXML-frågor.

Detta är den partiella resultatmängden:

<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. Att specificera sql:key-fields för att skapa korrekt nästling i resultatet

I följande schema finns ingen hierarki specificerad med sql<:relationship>. Schemat kräver fortfarande att sql:key-fields-annotationen specificeras för att unikt identifiera anställda i tabellen HumanResources.Employee.

<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>  
För att skapa ett fungerande exempel av detta schema
  1. Kopiera schemakoden ovan och klistra in den i en textfil. Spara filen som KeyFields2.xml.

  2. Kopiera följande mall och klistra in den i en textfil. Spara filen som KeyFields2T.xml i samma katalog där du sparade KeyFields2.xml. XPath-frågan i mallen returnerar alla <HumanResources.Employee-element> :

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

    Den katalogväg som anges för mappningsschemat (KeyFields2.xml) är relativ till katalogen där mallen sparas. En absolut väg kan också specificeras, till exempel:

    mapping-schema="C:\MyDir\KeyFields2.xml"  
    
  3. Skapa och använd SQLXML 4.0 Test Script (Sqlxml4test.vbs) för att köra mallen.

    För mer information, se Användning av ADO för att köra SQLXML-frågor.

Det här är resultatet:

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