Condividi tramite


Creazione di attributi di tipo ID, IDREF e IDREFS validi mediante sql:prefix (SQLXML 4.0)

È possibile specificare un attributo come attributo di tipo ID. Gli attributi specificati come IDREF o IDREFS possono essere quindi utilizzati per fare riferimento agli attributi di tipo ID, in modo da abilitare i collegamenti tra i documenti.

ID, IDREF e IDREFS corrispondono alle relazioni PK/FK (chiave primaria/chiave esterna) nel database, con poche differenze. In un documento XML i valori degli attributi di tipo ID devono essere distinti. Se gli attributi CustomerID e OrderID vengono specificati come tipo ID in un documento XML, tali valori devono essere distinti. In un database, tuttavia, le colonne CustomerID e OrderID possono avere gli stessi valori, ad esempio CustomerID = 1 e OrderID = 1.

Per specificare attributi ID, IDREF e IDREFS validi:

  • Il valore di ID deve essere univoco all'interno del documento XML.

  • Per ogni IDREF e IDREFS, i valori ID di riferimento devono trovarsi nel documento XML.

  • Il valore di un ID, IDREF e IDREFS deve essere un token denominato. Il valore integer 101, ad esempio, non può essere un valore ID.

  • Non è possibile eseguire il mapping degli attributi di tipo ID, IDREF e IDREFS alle colonne del tipo text, ntext o image o a qualsiasi altro tipo di dati binari, ad esempio timestamp.

Se un documento XML contiene più ID, utilizzare l'annotazione sql:prefix per assicurarsi che i valori siano univoci.

Notare che l'annotazione sql:prefix non può essere utilizzata con un attributo fisso XSD.

Esempi

Per creare esempi reali utilizzando gli esempi seguenti, è necessario soddisfare requisiti specifici. Per ulteriori informazioni, vedere Requisiti per l'esecuzione di esempi di SQLXML.

A. Specifica di tipi ID e IDREFS

Nello schema seguente l'elemento <Customer> è costituito dall'elemento figlio <Order>. L'elemento <Order> include un elemento figlio, ovvero l'elemento <OrderDetail>.

L'attributo OrderIDList di <Customer> è un attributo di tipo IDREFS che fa riferimento all'attributo OrderID dell'elemento <Order>.

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

Per testare una query Xpath di esempio sullo schema

  1. Copiare il codice dello schema sopra riportato e incollarlo in un file di testo. Salvare il file come sqlPrefix.xml.

  2. Copiare il modello seguente e incollarlo in un file di testo. Salvare il file come sqlPrefixT.xml nella stessa directory nella quale è stato salvato sqlPrefix.xml.

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

    Il percorso di directory specificato per lo schema di mapping (sqlPrefix.xml) è relativo alla directory nella quale viene salvato il modello. È possibile specificare anche un percorso assoluto, ad esempio:

    mapping-schema="C:\SqlXmlTest\sqlPrefix.xml"
    
  3. Creare e utilizzare lo script di test SQLXML 4.0 (Sqlxml4test.vbs) per eseguire il modello.

    Per ulteriori informazioni, vedere Utilizzo di ADO per eseguire query SQLXML.

Risultato parziale:

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