Introduzione sugli 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 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).For more information, see Introduction to Annotated XSD Schemas (SQLXML 4.0). Per le applicazioni legacy che usano XDR, vedere Annotated XDR Schemas (Deprecated in SQLXML 4.0).
Spazi dei nomi necessari nell'updategram
Le parole chiave in un updategram, ad esempio <la sincronizzazione>, <prima> e <dopo>, esistono nello spazio dei urn:schemas-microsoft-com:xml-updategram
nomi . 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.
<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ù blocchi di <sincronizzazione> . Ogni blocco di sincronizzazione> è un'unità di transazione, ovvero qualsiasi operazione nel blocco di sincronizzazione viene eseguita 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 alcuna 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 before> 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 esegue il mapping 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 fornire in modo esplicito lo schema di mapping tramite l'attributo mapping-schema
sui 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
Con il mapping predefinito (quando lo schema di mapping non viene specificato nell'updategram), gli elementi updategram eseguono il mapping a tabelle e agli elementi figlio (nel caso del mapping incentrato sugli elementi) e gli attributi (nel caso del mapping incentrato sugli attributi) eseguono il mapping alle 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 uno 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. Di conseguenza, l'attributo FirstName e l'elemento figlio LastName> eseguono il< mapping 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 caratteri validi SQL Server identificatori ma non identificatori XML validi, usare "__xHHHH__" come valore di codifica, dove HHHH indica il codice UCS-2 a quattro cifre per il carattere nell'ordine di bit più significativo. Usando questo schema di codifica, uno 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.
Vedere anche
Considerazioni sulla sicurezza degli updategram (SQLXML 4.0)