De serialisatie van XML-gegevens definiëren
van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Bij het casten van het xml- gegevenstype expliciet of impliciet naar een SQL-tekenreeks of binair type, wordt de inhoud van het xml- gegevenstype geserialiseerd volgens de regels die in dit artikel worden beschreven.
Serialisatiecodering
Als het SQL-doeltype VARBINARY is, wordt het resultaat geserialiseerd in UTF-16 met een UTF-16-bytevolgordemarkering vóór, maar zonder xml-declaratie. Als het doeltype te klein is, treedt er een fout op.
Bijvoorbeeld:
select CAST(CAST(N'<Δ/>' as XML) as VARBINARY(MAX))
Dit is het resultaat:
0xFFFE3C0094032F003E00
Als het SQL-doeltype NVARCHAR of NCHAR is, wordt het resultaat geserialiseerd in UTF-16 zonder de bytevolgordemarkering vóór en zonder xml-declaratie. Als het doeltype te klein is, wordt er een fout gegenereerd.
Bijvoorbeeld:
select CAST(CAST(N'<Δ/>' as XML) as NVARCHAR(MAX))
Dit is het resultaat:
<Δ/>
Als het SQL-doeltype VARCHAR of CHAR is, wordt het resultaat geserialiseerd in de codering die overeenkomt met de sorteringscodepagina van de database zonder bytevolgordemarkering of XML-declaratie. Als het doeltype te klein is of de waarde niet kan worden toegewezen aan de doelsorteringscodepagina, treedt er een fout op.
Bijvoorbeeld:
select CAST(CAST(N'<Δ/>' as XML) as VARCHAR(MAX))
Dit kan leiden tot een fout als de codepagina van de huidige sortering het Unicode-teken Δ niet kan vertegenwoordigen, of als het wordt weergegeven in een specifieke codering.
Bij het retourneren van XML-resultaten aan de clientzijde worden de gegevens verzonden in UTF-16-codering. De provider aan de clientzijde maakt vervolgens de gegevens beschikbaar volgens de API-regels.
Serialisatie van de XML-structuren
De inhoud van een xml- gegevenstype wordt op de gebruikelijke manier geserialiseerd. Met name elementknooppunten worden toegewezen aan elementmarkeringen en tekstknooppunten worden toegewezen aan tekstinhoud. De omstandigheden waaronder tekens worden omgezet in entiteiten en hoe getypte atomische waarden worden geserialiseerd, worden beschreven in de volgende secties.
Entitisatie van XML-tekens tijdens serialisatie
Elke geserialiseerde XML-structuur moet kunnen worden geparseerd. Daarom moeten sommige tekens in een gestructureerde vorm worden geserialiseerd om de mogelijkheid van een ronde reis van de tekens te behouden via de normalisatiefase van de XML-parser. Sommige tekens moeten echter worden omgezet in entiteiten, zodat het document goed geformeerd is en daardoor kan worden geparseerd. Hier volgen de regels voor entitisatie die van toepassing zijn tijdens serialisatie:
De tekens &, <en > worden altijd toegewezen aan respectievelijk
&
,<
en>
, als deze zich voordoen binnen een kenmerkwaarde of elementinhoud.Omdat SQL Server een aanhalingsteken (U+0022) gebruikt voor het insluiten van kenmerkwaarden, wordt het aanhalingsteken in kenmerkwaarden omgezet naar
"
.Een surrogaatpaar wordt omgezet als één enkele numerieke tekenreferentie wanneer er alleen op de server wordt gecast. Het surrogaatpaar U+D800 U+DF00 wordt bijvoorbeeld omgezet naar de numerieke karakterreferentie
𐌀
.Als u een TAB (U+0009) en een lijnfeed (LF, U+000A) wilt beschermen tegen normalisering tijdens het parseren, worden ze geconverteerd naar respectievelijk hun numerieke tekenverwijzingen
	
en

binnen attribuutwaarden.Om te voorkomen dat een regelterugloop (CR, U+000D) wordt genormaliseerd tijdens het parseren, wordt deze genormaliseerd op de numerieke tekenverwijzing,

binnen zowel kenmerkwaarden als elementinhoud.Als u tekstknooppunten wilt beveiligen die alleen witruimte bevatten, wordt een van de spatietekens, meestal de laatste, getitiseerd als numerieke verwijzing. Op deze manier behoudt het herparsen het tekstknooppunt van witruimte, ongeacht de instelling van het verwerken van witruimte tijdens het parseren.
Bijvoorbeeld:
DECLARE @u NVARCHAR(50)
set @u = N'<a a="
'+NCHAR(0xD800)+NCHAR(0xDF00)+N'>"> '+NCHAR(0xA)+N'</a>'
SELECT CAST(CONVERT(XML,@u,1) as NVARCHAR(50));
Dit is het resultaat:
<a a="
𐌀>">
</a>
Als u de laatste regel voor witruimtebeveiliging niet wilt toepassen, kunt u de expliciete CONVERT-optie 1 gebruiken bij het casten van XML- naar een tekenreeks of binair type. Als u bijvoorbeeldtitisatie wilt voorkomen, kunt u het volgende doen:
SELECT CONVERT(NVARCHAR(50), CONVERT(XML, '<a> </a>', 1), 1);
De query() method (XML-gegevenstype) resulteert in een xml- gegevenstype-exemplaar. Daarom wordt elk resultaat van de query()
-methode dat wordt gecast naar een tekenreeks of binair type omgezet in entiteiten volgens de eerder beschreven regels. Als u de tekenreekswaarden wilt ophalen die niet zijn getitiseerd, moet u in plaats daarvan de methode (XML-gegevenstype) gebruiken. Hieronder volgt een voorbeeld van het gebruik van de methode query()
:
DECLARE @x xml
SET @x = N'<a>This example contains an entitized char: .</a>'
SELECT @x.query('/a/text()');
Dit is het resultaat:
This example contains an entitized char: .
Hieronder volgt een voorbeeld van het gebruik van de methode value()
:
SELECT @x.value('(/a/text())[1]', 'nvarchar(100)');
Dit is het resultaat:
This example contains an entitized char: .
Een getypt XML-gegevenstype serialiseren
Een getypte xml- gegevenstype-exemplaar bevat waarden die zijn getypt op basis van hun XML-schematypen. Deze waarden worden geserialiseerd met hun XML-schematype in hetzelfde formaat als een XQuery-conversie naar xs:string oplevert. Zie Type Casting Rules in XQueryvoor meer informatie.
De xs:double-waarde 1.34e1 wordt bijvoorbeeld geserialiseerd op 13.4, zoals wordt weergegeven in het volgende voorbeeld:
declare @x xml
set @x =''
select CAST(@x.query('1.34e1') as nvarchar(50));
Hiermee wordt de tekenreekswaarde 13.4 geretourneerd.