Identificazione delle colonne chiave mediante sql:key-fields (schema XDR)

Nota importanteImportante

Questo argomento viene incluso come riferimento per le applicazioni legacy. Per la funzionalità descritta non è previsto alcun progetto di sviluppo futuro, pertanto si consiglia di evitare di utilizzarla in un nuovo progetto di sviluppo. Utilizzare invece gli schemi XSD con annotazioni per creare le viste XML. Per ulteriori informazioni, vedere Introduzione agli schemi XSD con annotazioni (SQLXML 4.0). È possibile convertire gli schemi XDR con annotazioni esistenti in schemi XSD. Per ulteriori informazioni, vedere Conversione di schemi XDR con annotazioni in schemi XSD equivalenti (SQLXML 4.0).

Quando si specifica una query XPath su uno schema XDR, nella maggior parte dei casi sono necessarie informazioni chiave per ottenere la nidificazione appropriata nel risultato. La specifica dell'annotazione sql:key-fields garantisce che venga generata la gerarchia appropriata.

[!NOTA]

Per produrre la nidificazione appropriata nel risultato, è consigliabile specificare sql:key-fields in tutti gli schemi.

In molte istanze è necessario identificare correttamente e in modo univoco le righe di una tabella per generare la gerarchia XML appropriata. È possibile aggiungere l'annotazione sql:key-fields a <element> e <ElementType> per individuare le colonne che identificano in modo univoco le righe nella tabella.

Il valore di sql:key-fields indica le colonne che identificano in modo univoco le righe nella relazione specificata in <ElementType>. Se sono necessarie più colonne per identificare in modo univoco una riga, i valori delle colonne vengono inseriti nell'elenco separati da spazi.

L'annotazione sql:key-fields deve essere specificata in un elemento contenente un elemento figlio e un oggetto <sql:relationship>, definito tra l'elemento e il figlio, che non fornisce la chiave primaria della tabella specificata nell'elemento padre.

Esempi

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

A. Creazione della nidificazione appropriata quando <sql:relationship> non fornisce informazioni sufficienti

In questo esempio viene illustrato dove specificare sql:key-fields.

Si consideri lo schema seguente: lo schema specifica la gerarchia tra gli elementi <Order> e <Customer> in cui l'elemento <Order> è il padre e l'elemento <Customer> è un figlio.

Per specificare la relazione padre-figlio, viene utilizzato il tag <sql:relationship> che identifica CustomerID nella tabella Sales.SalesOrderHeader come foreign-key con riferimento alla chiave CustomerID nella tabella Sales.Customer. Le informazioni fornite in <sql:relationship> non sono sufficienti a identificare in modo univoco le righe nella tabella padre (Sales.SalesOrderHeader). Se pertanto non si specifica l'annotazione sql:key-fields, la gerarchia generata non è precisa.

Quando invece si specifica sql:key-fields in <Order>, l'annotazione identifica in modo univoco le righe nell'elemento padre (tabella Sales.SalesOrderHeader) e i relativi elementi figlio vengono visualizzati al di sotto del rispettivo elemento padre.

Lo schema è il seguente:

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

Per testare un esempio reale di questo schema

  1. Copiare il codice dello schema precedente e incollarlo in un file di testo. Salvare il file con il nome KeyFieldsA-Xdr.xml.

  2. Copiare il modello seguente e incollarlo in un file di testo. Salvare il file con il nome KeyFieldsA-XdrT.xml nella stessa directory nella quale è stato salvato KeyFieldsA-Xdr.xml.

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

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

    mapping-schema="C:\MyDir\KeyFieldsA-Xdr.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 4.0.

Set di risultati:

<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. Specifica di sql:key-fields per produrre una nidificazione appropriata nel risultato

Nello schema seguente non è presente alcuna gerarchia specificata mediante <sql:relationship>. È necessaria la specifica dell'annotazione sql:key-fields per identificare in modo univoco i dipendenti nella tabella HumanResources.Employee.

<?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="EmployeeID" />
      <attribute type="EmployeeID" />
   </ElementType>

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

Per testare un esempio reale di questo schema

  1. Copiare il codice dello schema precedente e incollarlo in un file di testo. Salvare il file con il nome KeyFieldsB-Xdr.xml.

  2. Copiare il modello seguente e incollarlo in un file di testo. Salvare il file con il nome KeyFieldsB-XdrT.xml nella stessa directory nella quale è stato salvato KeyFieldsB-Xdr.xml. La query XPath nel modello restituisce tutti gli elementi <Order>:

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

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

    mapping-schema="C:\MyDir\KeyFieldsB-Xdr.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 4.0.

Di seguito è riportata una parte del set di risultati:

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

Vedere anche

Riferimento