Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server
Azure SQL Database
U kunt een database in Microsoft SQL Server wijzigen (invoegen, bijwerken of verwijderen) vanuit een bestaand XML-document met behulp van een updategram of de functie OPENXML Transact-SQL.
De OPENXML-functie wijzigt een database door het bestaande XML-document te versnipperen en een rijset te leveren die kan worden doorgegeven aan een INSERT-, UPDATE- of DELETE-instructie. Met OPENXML worden bewerkingen direct uitgevoerd op de databasetabellen. Daarom is OPENXML het meest geschikt waar rowsetproviders, zoals een tabel, als bron kunnen verschijnen.
Net als OPENXML stelt een updategram je in staat om gegevens in de database in te voegen, bij te werken of te verwijderen; echter, een updategram werkt tegen de XML-weergaven die worden geleverd door het geannoteerde XSD- (of een XDR-) schema; bijvoorbeeld, de updates worden toegepast op de XML-weergave die door het mapping schema wordt geleverd. Het mappingschema bevat op zijn beurt de benodigde informatie om XML-elementen en attributen toe te wijzen op de bijbehorende databasetabellen en -kolommen. Het updategram gebruikt deze mapping-informatie om de databasetabellen en -kolommen bij te werken.
Opmerking
Deze documentatie gaat ervan uit dat je bekend bent met sjablonen en mapping schema-ondersteuning in SQL Server. Voor meer informatie, zie Inleiding tot Geannoteerde XSD-schema's (SQLXML 4.0). Voor legacy-applicaties die XDR gebruiken, zie Annotated XDR Schemas (Deprecated in SQLXML 4.0).
Vereiste naamruimtes in het updategram
De trefwoorden in een updategram, zoals <sync>, <vóór> en <na>, bestaan in de urn:schemas-microsoft-com:xml-updategram naamruimte. Het naamruimte-prefix dat je gebruikt is willekeurig. In deze documentatie duidt het updg-voorvoegsel de updategram-naamruimte aan.
Syntaxis herzien
Een updategram is een sjabloon met <sync->, <voor-> en <na-blokken> die de syntaxis van het updategram vormen. De volgende code toont deze syntaxis in zijn eenvoudigste vorm:
<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>
De volgende definities beschrijven de rol van elk van deze blokken:
<voor>
Identificeert de bestaande toestand (ook wel "de voor-toestand" genoemd) van de recordinstantie.
<na>
Identificeert de nieuwe staat waarnaar data moet worden gewijzigd.
<Sync>
Bevat de <voor-> en <nablokken> . Een <sync> block kan meer dan één set <voor-> en <na-blokken> bevatten. Als er meer dan één set <voor-> en <na-blokken> is, moeten deze blokken (zelfs als ze leeg zijn) als paren worden gespecificeerd. Bovendien kan een updategram meer dan één <synchronisatieblok> hebben. Elk <syncblok> is één eenheid transactie (wat betekent dat ofwel alles in het <syncblok> gedaan is of niets gedaan is). Als je meerdere <synchronisatieblokken> specificeert in een updategram, heeft het falen van één <synchronisatieblok> geen invloed op de andere <synchronisatieblokken> .
Of een updategram een recordinstantie verwijdert, invoegt of bijwerkt, hangt af van de inhoud van de <voor-> en <na-blokken> :
Als een recordinstantie alleen verschijnt in het <voor-blok> en er geen overeenkomstige instantie in het <na-blok> , voert het updategram een verwijderingsoperatie uit.
Als een recordinstantie alleen voorkomt in het <na-blok> zonder een overeenkomstige instantie in het <voor-blok> , is het een insert-operatie.
Als een recordinstantie verschijnt in het <voor-blok> en een overeenkomstige instantie in het <na-blok> heeft, is dit een update-operatie. In dit geval werkt het updategram de recordinstantie bij naar de waarden die in het <na-blok> zijn gespecificeerd.
Het specificeren van een mappingschema in het updategram
In een updategram kan de XML-abstractie die door een mappingschema wordt geleverd (zowel XSD- als XDR-schema's worden ondersteund) impliciet of expliciet zijn (dat wil zeggen, een updategram kan werken met of zonder een gespecificeerd mappingschema). Als je geen mappingschema specificeert, gaat het updategram uit van een impliciete mapping (de standaardmapping), waarbij elk element in het <voor-> of <na-blok> naar een tabel wordt gemapt en het kindelement of attribuut van elk element naar een kolom in de database. Als je expliciet een mappingschema specificeert, moeten de elementen en attributen in het updategram overeenkomen met de elementen en attributen in het mappingschema.
Impliciete (standaard) Mapping
In de meeste gevallen vereist een updategram dat eenvoudige updates uitvoert geen mappingschema. In dit geval vertrouwt het updategram op het standaard mappingschema.
Het volgende updategram toont impliciete mapping. In dit voorbeeld voegt het updategram een nieuwe klant in in de Sales.Customer-tabel. Omdat dit updategram impliciete mapping gebruikt, wordt het <element Sales.Customer> gekoppeld aan de Sales.Customer-tabel, en de attributen CustomerID en SalesPersonID worden gekoppeld aan de overeenkomstige kolommen in de Sales.Customer-tabel.
<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>
Expliciete Mapping
Als je een mappingschema specificeert (XSD of XDR), gebruikt het updategram het schema om de databasetabellen en kolommen te bepalen die bijgewerkt moeten worden.
Als het updategram een complexe update uitvoert (bijvoorbeeld records invoegen in meerdere tabellen op basis van de ouder-kindrelatie die in het mapping schema is gespecificeerd), moet je het mapping-schema expliciet aangeven door gebruik te maken van het mapping-schema attribuut waarop het updategram wordt uitgevoerd.
Omdat een updategram een sjabloon is, is het pad dat voor het mappingschema in het updategram is gespecificeerd relatief ten opzichte van de locatie van het sjabloonbestand (ten opzichte van waar het updategram is opgeslagen). Voor meer informatie, zie Specificering van een geannoteerd kaartschema in een updategram (SQLXML 4.0).
Element-centrische en attribuutgerichte mapping in Updategrams
Bij standaardmapping (wanneer het mappingschema niet is gespecificeerd in het updategram), mappen de updategram-elementen tabellen en de kindelementen (in het geval van elementcentrische mapping) en de attributen (in het geval van attribuutgerichte mapping) naar kolommen.
Elementcentrische mapping
In een elementcentrisch updategram bevat een element kindelementen die de eigenschappen van het element aanduiden. Als voorbeeld, zie het volgende updategram. Het <Person.Contact-element> bevat de <FirstName-> en <LastName-kindelementen> . Deze kindelementen zijn eigenschappen van het <Person.Contact-element> .
Omdat dit updategram geen mappingschema specificeert, gebruikt het updategram impliciete mapping, waarbij het <Person.Contact-element> wordt gekoppeld aan de Person.Contact-tabel en de kindelementen worden gekoppeld aan de kolommen FirstName en LeftName.
<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>
Attribuutgerichte mapping
Bij een attribuutgerichte afbeelding hebben de elementen attributen. Het volgende updategram maakt gebruik van attribute-centrische mapping. In dit voorbeeld bestaat het <Person.Contact-element> uit de FirstName - en EtterName-attributen . Deze attributen zijn de eigenschappen van het <Person.Contact-element> . Net als in het vorige voorbeeld specificeert dit updategram geen mappingschema, dus het vertrouwt op impliciete mapping om het <Person.Contact-element> te mappen naar de Person.Contact-tabel en de attributen van het element naar de respectievelijke kolommen in de tabel.
<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>
Zowel Element-centrische als Attribuut-centrische Mapping gebruiken
Je kunt een mix van element-centrische en attribuut-centrische mapping specificeren, zoals te zien is in de volgende updategram. Let op dat het <Person.Contact-element> zowel een attribuut als een kind-element bevat. Ook is dit updategram gebaseerd op impliciete mapping. Zo worden het FirstName-attribuut en het <Achternaam-kindelement> gekoppeld aan de overeenkomstige kolommen in de Person.Contact-tabel.
<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>
Werken met tekens die geldig zijn in SQL Server maar niet geldig in XML
In SQL Server kunnen tabelnamen een ruimte bevatten. Dit type tabelnaam is echter niet geldig in XML.
Om tekens te coderen die geldige SQL Server-identificaties zijn maar geen geldige XML-identificaties, gebruik je '__xHHHH__' als coderingswaarde, waarbij HHHH staat voor de viercijferige hexadecimale UCS-2-code voor het teken in de meest significante bit-eerste volgorde. Met dit coderingsschema wordt een spatiekarakter vervangen door x0020 (de viercijferige hexadecimale code voor een spatiekarakter); daardoor wordt de tabelnaam [Order Details] in SQL Server _x005B_Order_x0020_Details_x005D_ in XML.
Evenzo moet je mogelijk driedelige elementnamen specificeren, zoals <[database].[ eigenaar]. [tafel]>. Omdat de haaktekens ([ en ]) niet geldig zijn in XML, moet je dit specificeren als <_x005B_database_x005D_._x005B_owner_x005D_._x005B_table_x005D_>, waarbij _x005B_ de codering voor de linker haak ([) is en _x005D_ de codering voor de rechter haak (]).
Updategrams uitvoeren
Omdat een updategram een sjabloon is, zijn alle verwerkingsmechanismen van een sjabloon van toepassing op het updategram. Voor SQLXML 4.0 kun je een updategram op een van de volgende manieren uitvoeren:
Door het in te dienen in een ADO-commando.
Door het als een OLE DB-commando in te dienen.