Definiera serialiseringen av XML-data
gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
När du konverterar XML- datatyp explicit eller implicit till en SQL-sträng eller binär typ, kommer innehållet i XML- datatyp serialiseras enligt de regler som beskrivs i den här artikeln.
Serialiseringskodning
Om SQL-måltypen är VARBINARY serialiseras resultatet i UTF-16 med en byteordningsmarkering i UTF-16 framför, men utan en XML-deklaration. Om måltypen är för liten utlöses ett fel.
Till exempel:
select CAST(CAST(N'<Δ/>' as XML) as VARBINARY(MAX))
Det här är resultatet:
0xFFFE3C0094032F003E00
Om SQL-måltypen är NVARCHAR eller NCHAR serialiseras resultatet i UTF-16 utan byteordningsmarkeringen framför och utan en XML-deklaration. Om måltypen är för liten genereras ett fel.
Till exempel:
select CAST(CAST(N'<Δ/>' as XML) as NVARCHAR(MAX))
Det här är resultatet:
<Δ/>
Om SQL-måltypen är VARCHAR eller CHAR serialiseras resultatet i kodningen som motsvarar databasens sorteringskodsida utan byteordningsmärke eller XML-deklaration. Om måltypen är för liten eller om värdet inte kan mappas till målsorteringskodsidan utlöses ett fel.
Till exempel:
select CAST(CAST(N'<Δ/>' as XML) as VARCHAR(MAX))
Detta kan resultera i ett fel om den aktuella sorteringskodens sida inte kan representera Unicode-tecknet Δ, eller om den representerar det i den specifika kodningen.
När XML-resultat returneras till klientsidan skickas data i UTF-16-kodning. Providern på klientsidan exponerar sedan data enligt dess API-regler.
Serialisering av XML-strukturerna
Innehållet i en XML- datatyp serialiseras på vanligt sätt. Mer specifikt mappas elementnoder till elementmarkering och textnoder mappas till textinnehåll. Dock beskrivs de omständigheter under vilka tecken entitiseras och hur typade atomvärden serialiseras i följande avsnitt.
Entitisering av XML-tecken under serialisering
Varje serialiserad XML-struktur bör kunna parsas om. Därför måste vissa tecken serialiseras i entitetsform för att bevara möjligheten till rundresa för tecknen genom XML-parsarens normaliseringsfas. Vissa tecken måste dock vara aktiverade så att dokumentet är välformulerat och därför kan parsas. Följande är de entitiseringsregler som gäller under serialiseringen:
Tecknen &, <och > omvandlas alltid till
&
,<
respektive>
om de förekommer i ett attributvärde eller elementinnehåll.Eftersom SQL Server använder ett citattecken (U+0022) för att omsluta attributvärden, anges citattecknet i attributvärden som
"
.Ett surrogatpar representeras som en referens till ett numeriskt tecken, endast vid rendering på servern. Surrogatparet U+D800 U+DF00 är till exempel berättigat till den numeriska teckenreferensen
𐌀
.För att skydda en TAB (U+0009) och en linjefeed (LF, U+000A) från att normaliseras under parsningen, representeras de av sina numeriska teckenreferenser
	
respektive

inuti attributvärden.För att förhindra att en vagnretur (CR, U+000D) normaliseras under parsningen, är den berättigad till dess numeriska teckenreferens,

i både attributvärden och elementinnehåll.För att skydda textnoder som endast innehåller tomt utrymme, är ett av blankstegsteckenen, vanligtvis det sista, entiterade som dess numeriska teckenreferens. På så sätt bevarar omarbetningen textnodens blanksteg, oavsett inställningen för hanteringen av blanksteg under parsningen.
Till exempel:
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));
Det här är resultatet:
<a a="
𐌀>">
</a>
Om du inte vill tillämpa den sista regeln för skydd av blanksteg, kan du använda det explicita alternativet KONVERTERA 1 när du konverterar från xml till en sträng- eller binär typ. Om du till exempel vill undvika entisering kan du göra följande:
SELECT CONVERT(NVARCHAR(50), CONVERT(XML, '<a> </a>', 1), 1);
Metoden query() (xml-datatyp) resulterar i en xml- instans av datatypen. Därför entitiseras alla resultat av query()
-metoden som omvandlas till en sträng eller binär typ enligt de tidigare beskrivna reglerna. Om du vill hämta strängvärdena som inte är aktiverade bör du använda metoden value() (xml-datatyp) i stället. Följande är ett exempel på hur du använder metoden query()
:
DECLARE @x xml
SET @x = N'<a>This example contains an entitized char: .</a>'
SELECT @x.query('/a/text()');
Det här är resultatet:
This example contains an entitized char: .
Följande är ett exempel på hur du använder metoden value()
:
SELECT @x.value('(/a/text())[1]', 'nvarchar(100)');
Det här är resultatet:
This example contains an entitized char: .
Serialisera en typ av XML-datatyp
En skriven XML- datatypsinstans innehåller värden som skrivs enligt deras XML-schematyper. Dessa värden serialiseras enligt xml-schematypen i samma format som XQuery-gjutningen till xs:string genererar. För mer information, se Typomvandlingsregler i XQuery.
Till exempel serialiseras xs:double-värdet 1.34e1 till 13,4 enligt följande exempel:
declare @x xml
set @x =''
select CAST(@x.query('1.34e1') as nvarchar(50));
Detta returnerar strängvärdet 13.4.