Introduzione sugli updategram (SQLXML 4.0)

Si applica a: SQL Server database SQL di Azure

È 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 suddividendo 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 del database. OPENXML rappresenta pertanto la scelta più appropriata ogni volte che un provider di set di righe, ad esempio una tabella, può essere visualizzato come origine.

Analogamente a OPENXML, un updategram consente di inserire, aggiornare o eliminare dati nel database. Un updategram, tuttavia, agisce sulle viste XML fornite dallo schema XSD (o XDR) con annotazioni, applicando, ad esempio, gli aggiornamenti alla vista XML fornita dallo schema di mapping. Lo schema di mapping, a sua volta, dispone delle informazioni necessarie per eseguire il mapping di elementi e attributi XML alle tabelle e alle colonne di database corrispondenti. L'updategram utilizza queste informazioni di mapping per aggiornare le tabelle e le colonne di database.

Nota

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 necessari nell'updategram

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

Esame della sintassi

Un updategram è un modello con <sincronizzazione>,< prima> e <dopo> i blocchi che formano la sintassi dell'updategram. Tale sintassi, nella sua forma più semplice, viene illustrata nel codice seguente:

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

Nelle definizioni seguenti viene descritto il ruolo di ogni blocco:

<prima>
Identifica lo stato esistente, denominato anche "stato before", dell'istanza del record.

<dopo>
Identifica il nuovo stato in cui devono essere modificati i dati.

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

Definizione di uno schema di mapping nell'updategram

In un updategram l'astrazione XML fornita da uno schema di mapping (sono supportati gli schemi XSD e XDR) può essere implicita o esplicita, ovvero un updategram può essere utilizzato 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 deve corrispondere agli elementi e agli attributi nello schema di mapping.

Mapping implicito (predefinito)

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

Nell'updategram seguente viene illustrato 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 utilizza lo schema per determinare le tabelle e le colonne di database che devono essere aggiornate.

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 dello schema di mapping su cui viene eseguito l'updategram.

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

Mapping incentrato sugli elementi e mapping incentrato sugli attributi negli updategram

Utilizzando il mapping predefinito, quando lo schema di mapping non viene specificato nell'updategram, gli elementi dell'updategram vengono mappati a tabelle, mentre gli elementi figlio (nel caso di mapping incentrato sugli elementi) e gli attributi (nel caso di mapping incentrato sugli attributi) vengono mappati a colonne.

Mapping incentrato sugli elementi

In un updategram incentrato sugli elementi, un elemento contiene elementi figlio che indicano le proprietà dell'elemento. Si consideri, ad esempio, l'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>  

mapping incentrato sugli attributi

In un mapping incentrato sugli attributi, gli elementi includono attributi. Nell'updategram seguente viene utilizzato 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>  

Utilizzo di una combinazione di mapping incentrato sugli elementi e mapping incentrato sugli attributi

È possibile specificare una combinazione di mapping incentrato sugli elementi e mapping incentrato sugli attributi, come illustrato nell'updategram seguente. Si noti che l'elemento <Person.Contact> contiene sia un attributo che un elemento figlio. L'updategram si basa inoltre su un 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 validi in XML

In SQL Server i nomi delle tabelle possono includere uno spazio. Questo tipo di nome di tabella, tuttavia, 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, utilizza tutti i meccanismi di elaborazione di un modello. Per SQLXML 4.0, è possibile eseguire un updategram in una delle modalità seguenti:

  • Inviandolo in un comando ADO.

  • Inviandolo come comando OLE DB.

Vedi anche

Considerazioni sulla sicurezza degli updategram (SQLXML 4.0)