Condividi tramite


Introduzione agli Updategram (SQLXML 4.0)

È possibile modificare (inserire, aggiornare o eliminare) un database in Microsoft SQL Server da un documento XML esistente usando un updategram o la funzione Transact-SQL OPENXML.

La funzione OPENXML modifica un database eliminando il documento XML esistente e fornendo un set di righe che può essere passato a un'istruzione INSERT, UPDATE o DELETE. Con OPENXML, le operazioni vengono eseguite direttamente sulle tabelle di database. Pertanto, OPENXML è più appropriato ovunque i provider di set di righe, ad esempio una tabella, possano essere visualizzati come origine.

Come OPENXML, un updategram consente di inserire, aggiornare o eliminare dati nel database; tuttavia, un updategram funziona con le viste XML fornite dallo schema XSD (o XDR) con annotazioni; Ad esempio, gli aggiornamenti vengono applicati alla visualizzazione XML fornita dallo schema di mapping. Lo schema di mapping, a sua volta, contiene le informazioni necessarie per eseguire il mapping di elementi e attributi XML alle tabelle e alle colonne di database corrispondenti. L'updategram usa queste informazioni di mapping per aggiornare le tabelle e le colonne del database.

Annotazioni

Questa documentazione presuppone che si abbia familiarità con i modelli e il supporto dello schema di mapping in SQL Server. Per altre informazioni, vedere Introduzione agli schemi XSD con annotazioni (SQLXML 4.0). Per le applicazioni legacy che usano XDR, vedere Annotated XDR Schemas (Deprecato in SQLXML 4.0).

Spazi dei nomi obbligatori nell'Updategram

Le parole chiave in un updategram, ad esempio <sync>, <before> e <after>, esistono nello spazio dei urn:schemas-microsoft-com:xml-updategram nomi . Il prefisso dello spazio dei nomi usato è arbitrario. In questa documentazione il updg prefisso indica lo updategram spazio dei nomi.

Revisione della sintassi

Un updategram è un modello con <sincronizzazione>, <prima> e <dopo> i blocchi che formano la sintassi dell'updategram. Il codice seguente illustra questa sintassi nel formato più semplice:

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">  
  <updg:sync [mapping-schema= "AnnotatedSchemaFile.xml"] >  
    <updg:before>  
        ...  
    </updg:before>  
    <updg:after>  
        ...  
    </updg:after>  
  </updg:sync>  
</ROOT>  

Le definizioni seguenti descrivono il ruolo di ognuno di questi blocchi:

<prima>
Identifica lo stato esistente (detto anche "stato precedente") dell'istanza del record.

<dopo>
Identifica il nuovo stato in cui modificare i dati.

<Sincronizzazione>
Contiene i <blocchi prima> e <dopo> . Un <blocco di sincronizzazione> può contenere più di un set di <blocchi prima> e <dopo> . Se sono presenti più set di <blocchi prima> e <dopo> , questi blocchi (anche se sono vuoti) devono essere specificati come coppie. Inoltre, un updategram può avere più di un <blocco di sincronizzazione> . Ogni <blocco di sincronizzazione> è un'unità di transazione, ovvero tutto il resto del <blocco di sincronizzazione> viene eseguito o non viene eseguita alcuna operazione. Se si specificano più <blocchi di sincronizzazione> in un updategram, l'errore di un <blocco di sincronizzazione non influisce sugli altri blocchi di sincronizzazione>>.<

Se un updategram elimina, inserisce o aggiorna un'istanza di record dipende dal contenuto dei <blocchi prima> e <dopo> :

  • Se un'istanza <di record viene visualizzata solo nel blocco before> senza istanza corrispondente nel <blocco after> , l'updategram esegue un'operazione di eliminazione.

  • Se un'istanza <di record viene visualizzata solo nel blocco after> senza alcuna istanza corrispondente nel <blocco before> , si tratta di un'operazione di inserimento.

  • Se un'istanza di <record viene visualizzata nel blocco prima> e ha un'istanza <corrispondente nel blocco after> , si tratta di un'operazione di aggiornamento. In questo caso, l'updategram aggiorna l'istanza del record ai valori specificati nel <blocco after> .

Specifica di uno schema di mapping nell'updategram

In un updategram, l'astrazione XML fornita da uno schema di mapping (sia gli schemi XSD che gli schemi XDR sono supportati) può essere implicita o esplicita, ovvero un updategram può funzionare con o senza uno schema di mapping specificato. Se non si specifica uno schema di mapping, l'updategram presuppone un mapping implicito (mapping predefinito), in cui ogni elemento del <blocco precedente> o <successivo> esegue il mapping a una tabella e l'elemento figlio o l'attributo di ogni elemento viene mappato a una colonna nel database. Se si specifica in modo esplicito uno schema di mapping, gli elementi e gli attributi nell'updategram devono corrispondere agli elementi e agli attributi nello schema di mapping.

Mapping implicito (predefinito)

Nella maggior parte dei casi, un updategram che esegue semplici aggiornamenti potrebbe non richiedere uno schema di mapping. In questo caso, l'updategram si basa sullo schema di mapping predefinito.

L'updategram seguente illustra il mapping implicito. In questo esempio l'updategram inserisce un nuovo cliente nella tabella Sales.Customer. Poiché questo updategram usa il mapping implicito, l'elemento Sales.Customer esegue il <mapping alla tabella Sales.Customer> e gli attributi CustomerID e SalesPersonID eseguono il mapping alle colonne corrispondenti nella tabella Sales.Customer.

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">  
<updg:sync >  
<updg:before>  
</updg:before>  
<updg:after>  
    <Sales.Customer CustomerID="1" SalesPersonID="277" />  
    </updg:after>  
</updg:sync>  
</ROOT>  

Mapping esplicito

Se si specifica uno schema di mapping (XSD o XDR), l'updategram usa lo schema per determinare le tabelle e le colonne del database da aggiornare.

Se l'updategram esegue un aggiornamento complesso, ad esempio l'inserimento di record in più tabelle sulla base della relazione padre-figlio specificata nello schema di mapping, è necessario specificare in modo esplicito lo schema di mapping usando l'attributo su cui viene eseguito l'updategram mapping-schema .

Poiché un updategram è un modello, il percorso specificato per lo schema di mapping nell'updategram è relativo al percorso del file modello (relativo alla posizione in cui è archiviato l'updategram). Per altre informazioni, vedere Specifica di uno schema di mapping con annotazioni in un updategram (SQLXML 4.0).

Mapping incentrato sugli elementi e incentrato sugli attributi negli updategram

Con il mapping predefinito (quando lo schema di mapping non viene specificato nell'updategram), gli elementi updategram vengono mappati alle tabelle e agli elementi figlio (nel caso del mapping incentrato sugli elementi) e gli attributi (nel caso del mapping incentrato sugli attributi) vengono mappati alle colonne.

Mapping incentrato sugli elementi

In un updategram incentrato sugli elementi, un elemento contiene elementi figlio che indicano le proprietà dell'elemento. Ad esempio, fare riferimento all'updategram seguente. L'elemento <Person.Contact> contiene gli elementi figlio **<FirstName>**e <LastName> . Questi elementi figlio sono proprietà dell'elemento <Person.Contact> .

Poiché questo updategram non specifica uno schema di mapping, l'updategram usa il mapping implicito, in cui l'elemento Person.Contact> esegue il< mapping alla tabella Person.Contact e ai relativi elementi figlio vengono mappati alle colonne FirstName e LastName.

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">  
<updg:sync >  
  <updg:after>  
    <Person.Contact>  
       <FirstName>Catherine</FirstName>  
       <LastName>Abel</LastName>  
    </Person.Contact>  
  </updg:after>  
</updg:sync>  
</ROOT>  

Mappatura incentrata sugli attributi

In un mapping incentrato sugli attributi, gli elementi hanno attributi. L'updategram seguente usa il mapping incentrato sugli attributi. In questo esempio l'elemento <Person.Contact> è costituito dagli attributi FirstName e LastName. Questi attributi sono le proprietà dell'elemento <Person.Contact> . Come nell'esempio precedente, questo updategram non specifica alcun schema di mapping, pertanto si basa sul mapping implicito per eseguire il mapping dell'elemento <Person.Contact> alla tabella Person.Contact e agli attributi dell'elemento alle rispettive colonne della tabella.

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">  
<updg:sync >  
  <updg:before>  
  </updg:before>  
  <updg:after>  
    <Person.Contact FirstName="Catherine" LastName="Abel" />  
  </updg:after>  
</updg:sync>  
</ROOT>  

Uso di mapping incentrato sugli elementi e incentrato sugli attributi

È possibile specificare una combinazione di mapping incentrato sugli elementi e incentrato sugli attributi, come illustrato nell'updategram seguente. Si noti che l'elemento <Person.Contact> contiene sia un attributo che un elemento figlio. Inoltre, questo updategram si basa sul mapping implicito. Pertanto, l'attributo FirstName e l'elemento <figlio LastName> vengono mappati alle colonne corrispondenti nella tabella Person.Contact.

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">  
<updg:sync >  
  <updg:before>  
  </updg:before>  
  <updg:after>  
    <Person.Contact FirstName="Catherine" >  
       <LastName>Abel</LastName>  
    </Person.Contact>  
  </updg:after>  
</updg:sync>  
</ROOT>  

Utilizzo di caratteri validi in SQL Server ma non valido in XML

In SQL Server i nomi delle tabelle possono includere uno spazio. Tuttavia, questo tipo di nome di tabella non è valido in XML.

Per codificare i caratteri che sono identificatori di SQL Server validi ma non sono identificatori XML validi, usare "__xHHHH__" come valore di codifica, dove HHHHH indica il codice UCS-2 a quattro cifre per il carattere nell'ordine di bit più significativo. Usando questo schema di codifica, un carattere di spazio viene sostituito con x0020 (il codice esadecimale a quattro cifre per un carattere di spazio); pertanto, il nome della tabella [Dettagli ordine] in SQL Server diventa _x005B_Order_x0020_Details_x005D_ in XML.

Analogamente, potrebbe essere necessario specificare nomi di elementi in tre parti, ad esempio <[database].[ proprietario]. [tabella]>. Poiché i caratteri tra parentesi quadre ([ e ]) non sono validi in XML, è necessario specificare questo valore come <_x005B_database_x005D_._x005B_owner_x005D_._x005B_table_x005D_>, dove _x005B_ è la codifica per la parentesi quadra sinistra ([) e _x005D_ è la codifica per la parentesi quadra destra (]).

Esecuzione di updategram

Poiché un updategram è un modello, tutti i meccanismi di elaborazione di un modello si applicano all'updategram. Per SQLXML 4.0, è possibile eseguire un updategram in uno dei modi seguenti:

  • Inviandolo in un comando ADO.

  • Inviandolo come comando OLE DB.

Vedere anche

Considerazioni sulla sicurezza di Updategram (SQLXML 4.0)