Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
gäller för:SQL Server
Azure SQL Database
Du kan ändra (infoga, uppdatera eller ta bort) en databas i Microsoft SQL Server från ett befintligt XML-dokument med hjälp av ett updategram eller funktionen OPENXML Transact-SQL.
Funktionen OPENXML modifierar en databas genom att strimla det befintliga XML-dokumentet och tillhandahålla en raduppsättning som kan skickas till en INSERT-, UPDATE- eller DELETE-sats. Med OPENXML utförs operationer direkt mot databastabellerna. Därför är OPENXML mest lämpligt där raduppsättningsleverantörer, såsom en tabell, kan visas som källa.
Liksom OPENXML tillåter ett updategram dig att infoga, uppdatera eller ta bort data i databasen; dock arbetar ett updategram mot XML-vyerna som tillhandahålls av det annoterade XSD- (eller XDR-)schemat; till exempel tillämpas uppdateringarna på XML-vyn som tillhandahålls av mappningsschemat. Mappningsschemat har i sin tur nödvändig information för att mappa XML-element och attribut till motsvarande databastabeller och kolumner. Uppdateringsgrammet använder denna mappningsinformation för att uppdatera databastabeller och kolumner.
Anmärkning
Denna dokumentation förutsätter att du är bekant med mallar och stöd för mappningsscheman i SQL Server. För mer information, se Introduktion till annoterade XSD-scheman (SQLXML 4.0). För äldre applikationer som använder XDR, se Annotated XDR Schemas (föråldrade i SQLXML 4.0).
Nödvändiga namnrymder i Updategrammet
Nyckelorden i ett updategram, såsom <sync>, <före> och <efter>, finns i urn:schemas-microsoft-com:xml-updategram-namnrymden . Prefixet i namnrymden du använder är godtyckligt. I denna dokumentation betecknar updg-prefixet updategram-namnrymden.
Granskning av syntax
Ett updategram är en mall med <synkroniserade>, <före>- och <efterblock> som bildar syntaxen för updategramet. Följande kod visar denna syntax i dess enklaste form:
<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>
Följande definitioner beskriver rollen för var och en av dessa block:
<före>
Identifierar det befintliga tillståndet (även kallat "före-tillståndet") för registerinstansen.
<efter>
Identifierar det nya tillståndet till vilket data ska ändras.
<synkronisering>
Innehåller före-> och efterblocken<>.< Ett <synkroniseringsblock> kan innehålla mer än en uppsättning <före-> och <efterblock> . Om det finns mer än en uppsättning <före-> och <efter-block> måste dessa block (även om de är tomma) specificeras som par. Dessutom kan ett updategram ha mer än ett <synkroniseringsblock> . Varje <synkblock> är en enhet av transaktion (vilket betyder att antingen är allt i synkblocket<> klart eller så görs ingenting). Om du anger flera <synkblock> i ett updategram, påverkar inte ett <synkroniseringsblock> de andra <synkblocken> .
Om ett updategram raderar, infogar eller uppdaterar en postinstans beror på innehållet i före-> och efterblocken<>:<
Om en postinstans endast föreföre-blocket<> före-före-blocket inte finns i motsvarande instans i <efter-blocket>, utför updategrammet en borttagningsoperation.
Om en postinstans endast förekommer i efter-blocket<> utan motsvarande instans i <före-blocket>, är det en insättningsoperation.
Om en postinstans förekommer i före-blocket<> och har en motsvarande instans i <efter-blocket>, är det en uppdateringsoperation. I detta fall uppdaterar updategramen postinstansen till de värden som anges i efter-blocket<>.
Specificering av ett mappningsschema i Updategrammet
I ett updategram kan XML-abstraktionen som tillhandahålls av ett mappschema (både XSD- och XDR-scheman stöds) vara implicit eller explicit (det vill säga, ett updategram kan fungera med eller utan ett specificerat mappningsschema). Om du inte specificerar ett mappningsschema antar updategrammet en implicit mappning (standardmappningen), där varje element i <före-> eller <efterblocket> mappas till en tabell och varje elements barnelement eller attribut mappas till en kolumn i databasen. Om du uttryckligen specificerar ett mappningsschema måste elementen och attributen i uppdateringsgrammet matcha elementen och attributen i mappningsschemat.
Implicit (standard) avbildning
I de flesta fall behöver ett updategram som utför enkla uppdateringar inte nödvändigtvis ett mappningsschema. I detta fall förlitar sig updategrammet på standardmappningsschemat.
Följande uppdateringsgram demonstrerar implicit mappning. I detta exempel infogar updategrammet en ny kund i tabellen Sales.Customer. Eftersom detta uppdateringsgram använder implicit mappning, mappas elementet <Sales.Customer> till tabellen Sales.Customer, och attributen CustomerID och SalesPersonID mappas till motsvarande kolumner i tabellen 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>
Explicit kartläggning
Om du specificerar ett mappningsschema (antingen XSD eller XDR) använder updategrammet schemat för att bestämma vilka databastabeller och kolumner som ska uppdateras.
Om updategrammet utför en komplex uppdatering (till exempel att infoga poster i flera tabeller baserat på föräldra-barn-relationen som anges i mappningsschemat), måste du uttryckligen ange mappningsschemat genom att använda mapping-schema-attributet som updategrammet körs mot.
Eftersom ett updategram är en mall, är den väg som anges för mappningsschemat i updategrammet relativ till mallens fils plats (relativt var updategrammet lagras). För mer information, se Specifikation av ett annoterat mappningsschema i ett uppdateringsgram (SQLXML 4.0).
Elementcentrerad och attributcentrerad mappning i Updategrams
Med standardmappning (när mappningsschemat inte specificeras i updategrammet) mappas updategram-elementen till tabeller och barnelementen (i fallet med elementcentrerad mappning) samt attributen (i fallet med attributcentrerad mappning) till kolumner.
Elementcentrerad kartläggning
I ett elementcentrerat uppdateringsgram innehåller ett element barnelement som betecknar elementets egenskaper. Som exempel, se följande updategram. Person.Contact-elementet<> innehåller <barnelementen FirstName> och <Ettername>. Dessa barnelement är egenskaper hos <Person.Kontakt-elementet> .
Eftersom detta updategram inte specificerar ett mappningsschema använder updategrammet implicit mappning, där elementet <Person.Contact> mappas till Person.Contact-tabellen och dess barnelement mappas till kolumnerna FirstName och Efternamn.
<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>
Attributcentrerad kartläggning
I en attributcentrerad avbildning har elementen attribut. Följande uppdateringsgram använder attributcentrerad kartläggning. I detta exempel består Person.Contact-elementet<> av attributen FirstName och Efternamn. Dessa attribut är egenskaperna hos <Person.Kontakt-elementet> . Som i det föregående exemplet specificerar detta updategram att inget mappningsschema finns, så det bygger på implicit mappning för att mappa <Person.Contact-elementet> till Person.Contact-tabellen och elementets attribut till respektive kolumner i tabellen.
<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>
Användning av både elementcentrerad och attributcentrerad kartläggning
Du kan specificera en blandning av elementcentrerad och attributcentrerad mappning, som visas i följande uppdateringsgram. Observera att Person.Contact-elementet<> innehåller både ett attribut och ett barnelement. Dessutom bygger detta uppdateringsgram på implicit mappning. Således mappas attributet FirstName och barnelementet< Efternamn> till motsvarande kolumner i Person.Contact-tabellen.
<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>
Att arbeta med tecken som är giltiga i SQL Server men inte giltiga i XML
I SQL Server kan tabellnamn innehålla ett mellanslag. Denna typ av tabellnamn är dock inte giltig i XML.
För att koda tecken som är giltiga SQL Server-identifierare men inte giltiga XML-identifierare, använd '__xHHHH__' som kodningsvärde, där HHHH står för den fyrsiffriga hexadecimala UCS-2-koden för tecknet i den mest signifikanta bit-första-ordningen. Med denna kodningsmetod ersätts ett mellanslagstecken med x0020 (den fyrsiffriga hexadecimala koden för ett mellanslagstecken); därmed blir tabellnamnet [Order Details] i SQL Server _x005B_Order_x0020_Details_x005D_ i XML.
På liknande sätt kan du behöva specificera tredelade elementnamn, såsom <[databas].[ ägare]. [bord].> Eftersom parentestecknen ([ och ]) inte är giltiga i XML måste du ange detta som <_x005B_database_x005D_._x005B_owner_x005D_._x005B_table_x005D_>, där _x005B_ är kodningen för vänstra parentesen ([) och _x005D_ är kodningen för högra parentesen (]).
Körning av uppdateringsgram
Eftersom ett updategram är en mall, gäller alla bearbetningsmekanismer i en mall för updategramet. För SQLXML 4.0 kan du köra ett updategram på något av följande sätt:
Genom att skicka in det i ett ADO-kommando.
Genom att skicka in det som ett OLE DB-kommando.