Delen via


Het aanmaken van geldige ID-, IDREF- en IDREFS-typeattributen met sql:prefix (SQLXML 4.0)

Van toepassing op:SQL ServerAzure SQL Database

Een attribuut kan worden gespecificeerd als een ID-type attribuut. Attributen die zijn gespecificeerd als IDREF of IDREFS kunnen vervolgens worden gebruikt om naar de ID-typeattributen te verwijzen, waardoor links tussen documenten mogelijk worden.

ID, IDREF en IDREFS komen overeen met PK/FK (primaire sleutel/vreemde sleutel) relaties in de database, met weinig verschillen. In een XML-document moeten de waarden van ID-typeattributen verschillend zijn. Als CustomerID- en OrderID-attributen als ID-type zijn opgegeven in een XML-document, moeten deze waarden verschillend zijn. In een database kunnen CustomerID- en OrderID-kolommen echter dezelfde waarden hebben. (Bijvoorbeeld, CustomerID = 1 en OrderID = 1 zijn geldig in de database).

Om de attributen ID, IDREF en IDREFS geldig te laten zijn:

  • De waarde van ID moet uniek zijn binnen het XML-document.

  • Voor elke IDREF en IDREFS moeten de verwezen ID-waarden in het XML-document staan.

  • De waarde van een ID, IDREF en IDREFS moet een benoemde token zijn. (Bijvoorbeeld, de gehele waarde 101 kan geen ID-waarde zijn.)

  • De attributen van ID, IDREF en IDREFS-type kunnen niet worden gekoppeld aan kolommen van het type tekst, ntext, afbeelding of enig ander binair datatype (bijvoorbeeld tijdstempel).

Als een XML-document meerdere ID's bevat, gebruik dan de sql:prefix-annotatie om ervoor te zorgen dat de waarden uniek zijn.

Let op dat sql:prefix-annotatie niet kan worden gebruikt met het XSD-vaste attribuut.

Voorbeelden

Om werkmonsters te maken met de volgende voorbeelden, moet je aan bepaalde eisen voldoen. Voor meer informatie, zie Vereisten voor het uitvoeren van SQLXML-voorbeelden.

Eén. Het specificeren van ID- en IDREFS-typen

In het volgende schema bestaat het <Customer-element> uit het <Order-kindelement> . Het <Order-element> heeft ook een kind-element, het <OrderDetail-element> .

Het OrderIDList-attribuut van <Customer> is een IDREFS-type attribuut dat verwijst naar het OrderID-attribuut van het <Order-element> .

<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="CustOrders"  
                 parent="Sales.Customer"  
                 parent-key="CustomerID"  
                 child="Sales.SalesOrderHeader"  
                 child-key="CustomerID" />  
    <sql:relationship name="OrderOrderDetail"  
                 parent="Sales.SalesOrderHeader"  
                 parent-key="SalesOrderID"  
                 child="Sales.SalesOrderDetail"  
                 child-key="SalesOrderID" />  
  </xsd:appinfo>  
</xsd:annotation>  
  <xsd:element name="Customer" sql:relation="Sales.Customer" >  
   <xsd:complexType>  
     <xsd:sequence>  
        <xsd:element name="Order" sql:relation="Sales.SalesOrderHeader"    
               sql:relationship="CustOrders" maxOccurs="unbounded" >  
          <xsd:complexType>  
              <xsd:sequence>  
                <xsd:element name="OrderDetail"   
                             sql:relation="Sales.SalesOrderDetail"   
                   sql:relationship="OrderOrderDetail"   
                   maxOccurs="unbounded" >  
                  <xsd:complexType>  
                   <xsd:attribute name="SalesOrderID" type="xsd:integer" />  
                   <xsd:attribute name="ProductID" type="xsd:string" />  
                   <xsd:attribute name="OrderQty" type="xsd:integer" />  
                  </xsd:complexType>  
               </xsd:element>  
             </xsd:sequence>  
             <xsd:attribute name="SalesOrderID"   
                            type="xsd:ID" sql:prefix="ord-" />  
             <xsd:attribute name="OrderDate" type="xsd:date" />  
             <xsd:attribute name="CustomerID" type="xsd:string" />  
          </xsd:complexType>  
      </xsd:element>  
    </xsd:sequence>  
    <xsd:attribute name="CustomerID" type="xsd:string" />  
    <xsd:attribute name="OrderIDList" type="xsd:IDREFS"   
                   sql:relation="Sales.SalesOrderHeader" sql:field="SalesOrderID"  
                   sql:relationship="CustOrders" sql:prefix="ord-">  
    </xsd:attribute>  
  </xsd:complexType>  
</xsd:element>  
</xsd:schema>  
Om een voorbeeld van een XPath-query te testen tegen het schema
  1. Kopieer de bovenstaande schemacode en plak deze in een tekstbestand. Sla het bestand op als sqlPrefix.xml.

  2. Kopieer het volgende sjabloon en plak het in een tekstbestand. Sla het bestand op als sqlPrefixT.xml in dezelfde map waar je sqlPrefix.xmlhebt opgeslagen.

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

    Het directorypad dat voor het mappingschema (sqlPrefix.xml) is gespecificeerd is relatief tot de map waar het sjabloon wordt opgeslagen. Een absoluut pad kan ook worden gespecificeerd, bijvoorbeeld:

    mapping-schema="C:\SqlXmlTest\sqlPrefix.xml"  
    
  3. Maak het SQLXML 4.0 Test Script (Sqlxml4test.vbs) aan en gebruik het om het sjabloon uit te voeren.

    Voor meer informatie, zie Gebruik ADO om SQLXML-queries uit te voeren.

Dit is het gedeeltelijke resultaat:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <Customer CustomerID="1" OrderIDList="ord-43860 ord-44501 ord-45283 ord-46042">  
    <Order SalesOrderID="ord-43860" OrderDate="2001-08-01" CustomerID="1">  
      <OrderDetail SalesOrderID="43860" ProductID="729" OrderQty="1" />   
      <OrderDetail SalesOrderID="43860" ProductID="732" OrderQty="1" />   
      <OrderDetail SalesOrderID="43860" ProductID="738" OrderQty="1" />   
      <OrderDetail SalesOrderID="43860" ProductID="753" OrderQty="2" />   
      ...  
    </Order>  
    ...  
 </Customer>  
</ROOT>