Definiowanie serializacji danych XML
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
W przypadku jawnego lub niejawnego rzutowania typu danych xml na ciąg SQL lub typ binarny, zawartość typu danych xml zostanie zserializowana zgodnie z zasadami opisanymi w tym artykule.
Kodowanie serializacji
Jeśli typ docelowy SQL to VARBINARY, wynik jest serializowany w formacie UTF-16 z znacznikiem kolejności bajtów UTF-16 na początku, ale bez deklaracji XML. Jeśli typ docelowy jest za mały, zostanie zgłoszony błąd.
Na przykład:
select CAST(CAST(N'<Δ/>' as XML) as VARBINARY(MAX))
Jest to wynik:
0xFFFE3C0094032F003E00
Jeśli typ docelowy SQL to NVARCHAR lub NCHAR, wynik jest serializowany w formacie UTF-16 bez znaku kolejności bajtów z przodu i bez deklaracji XML. Jeśli typ docelowy jest za mały, zostanie zgłoszony błąd.
Na przykład:
select CAST(CAST(N'<Δ/>' as XML) as NVARCHAR(MAX))
Jest to wynik:
<Δ/>
Jeśli typ docelowy SQL to VARCHAR lub CHAR, wynik jest serializowany w kodowaniu odpowiadającym stronie kodowej sortowania bazy danych bez znaku kolejności bajtów lub deklaracji XML. Jeśli typ docelowy jest zbyt mały lub nie można przyporządkować wartości do strony kodowej sortowania docelowego, pojawi się błąd.
Na przykład:
select CAST(CAST(N'<Δ/>' as XML) as VARCHAR(MAX))
Może to spowodować błąd, jeśli strona kodowa bieżącego sortowania nie może reprezentować znaku Unicode Δ lub będzie reprezentować go w określonym kodowaniu.
Podczas zwracania wyników XML po stronie klienta dane będą wysyłane w kodowaniu UTF-16. Następnie dostawca po stronie klienta uwidaczni dane zgodnie z regułami interfejsu API.
Serializacja struktur XML
Zawartość xml typu danych jest serializowana w zwykły sposób. W szczególności węzły elementów są mapowane na znaczniki elementów, a węzły tekstowe są mapowane na zawartość tekstową. Jednak okoliczności, w których symbole są zamieniane na encje, oraz sposób, w jaki przetypowane wartości atomowe są serializowane, opisano w poniższych sekcjach.
Zamiana znaków XML na encje podczas serializacji
Każda serializowana struktura XML powinna mieć możliwość ponownej analizy. W związku z tym niektóre znaki muszą być serializowane w sposób zanonimizowany, aby zachować możliwość dwukierunkowego przetwarzania znaków poprzez fazę normalizacji w analizatorze XML. Jednak niektóre znaki muszą być zakodowane tak, aby dokument był poprawnie sformułowany i w związku z tym można go zinterpretować. Poniżej przedstawiono reguły tworzenia tytułów, które mają zastosowanie podczas serializacji:
Znaki &, <i > są zawsze zamieniane na
&
,<
i>
, gdy występują wewnątrz wartości atrybutu lub zawartości elementu.Ponieważ program SQL Server używa cudzysłowu (U+0022) do ujęć wartości atrybutów, cudzysłów w wartościach atrybutów jest oznaczany jako
"
.Para zastępująca jest kodowana jako pojedyncze odniesienie numeryczne przy rzutowaniu wyłącznie na serwerze. Na przykład para zastępcza U+D800 U+DF00 jest przekształcona na numeryczną referencję znaków
𐌀
.Aby chronić kartę TAB (U+0009) i kanał liniowy (LF, U+000A) przed normalizacją podczas analizowania, są one tytułowane do odwołań znaków liczbowych
	
i

odpowiednio wewnątrz wartości atrybutów.Aby zapobiec normalizacji powrotu karetki (CR, U+000D) podczas analizowania, jest on tytułowany do odwołania do znaków liczbowych,

wewnątrz zarówno wartości atrybutu, jak i zawartości elementu.Aby chronić węzły tekstowe, które zawierają tylko białe znaki, jeden z białych znaków, zazwyczaj ostatni, jest nazwany jako odwołanie do znaków liczbowych. W ten sposób ponowne analizowanie zachowuje węzeł tekstowy białych znaków niezależnie od ustawienia obsługi białych znaków podczas analizowania.
Na przykład:
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));
Jest to wynik:
<a a="
𐌀>">
</a>
Jeśli nie chcesz stosować ostatniej reguły ochrony białych znaków, możesz użyć jawnej opcji KONWERTUJ 1 podczas rzutowania z xml do ciągu lub typu binarnego. Aby na przykład uniknąć utworzenia jednostki, możesz wykonać następujące czynności:
SELECT CONVERT(NVARCHAR(50), CONVERT(XML, '<a> </a>', 1), 1);
Metoda query() (xml Data Type) powoduje wystąpienie typu danych xml xml. W związku z tym każdy wynik metody query()
, który jest rzutowany na ciąg lub typ binarny, jest zabezpieczany zgodnie z wcześniej opisanymi regułami. Jeśli chcesz uzyskać wartości ciągów, które nie są ztytucjonalizowane, należy zamiast tego użyć metody value() (typ danych xml). Poniżej przedstawiono przykład użycia metody query()
:
DECLARE @x xml
SET @x = N'<a>This example contains an entitized char: .</a>'
SELECT @x.query('/a/text()');
Jest to wynik:
This example contains an entitized char: .
Poniżej przedstawiono przykład użycia metody value()
:
SELECT @x.value('(/a/text())[1]', 'nvarchar(100)');
Jest to wynik:
This example contains an entitized char: .
Serializowanie typowanego typu danych XML
Typizowane xml wystąpienie typu danych zawiera wartości, które są wpisywane zgodnie z ich typami schematu XML. Te wartości są serializowane zgodnie z ich typem schematu XML w tym samym formacie, w jakim XQuery konwertuje do xs:string. Aby uzyskać więcej informacji, zobacz Zasady rzutowania typów w XQuery.
Na przykład wartość xs:double 1.34e1 jest serializowana do 13.4, jak pokazano w poniższym przykładzie:
declare @x xml
set @x =''
select CAST(@x.query('1.34e1') as nvarchar(50));
Zwraca wartość ciągu 13.4.
Zobacz też
- Zasady rzutowania typów w XQuery
- RZUTOWANIE i konwertowanie (Transact-SQL)