Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Base de dados SQL no Microsoft Fabric
Ao transmitir o tipo de dados xml explícita ou implicitamente para uma cadeia de caracteres SQL ou tipo binário, o conteúdo do tipo de dados xml será serializado de acordo com as regras descritas neste artigo.
Codificação de serialização
Se o tipo de destino SQL for VARBINARY, o resultado será serializado em UTF-16 com uma marca de ordem de bytes UTF-16 na frente, mas sem uma declaração XML. Se o tipo de destino for muito pequeno, um erro será gerado.
Por exemplo:
select CAST(CAST(N'<Δ/>' as XML) as VARBINARY(MAX))
Este é o resultado:
0xFFFE3C0094032F003E00
Se o tipo de destino SQL for NVARCHAR ou NCHAR, o resultado será serializado em UTF-16, sem a marca de ordem de bytes à frente e sem uma declaração XML. Se o tipo de destino for muito pequeno, um erro será gerado.
Por exemplo:
select CAST(CAST(N'<Δ/>' as XML) as NVARCHAR(MAX))
Este é o resultado:
<Δ/>
Se o tipo de destino SQL for VARCHAR ou CHAR, o resultado será serializado na codificação que corresponde à página de código de agrupamento do banco de dados sem uma marca de ordem de bytes ou declaração XML. Se o tipo de destino for demasiado pequeno ou se o valor não puder ser mapeado para a página de código de agrupamento de destino, é gerado um erro.
Por exemplo:
select CAST(CAST(N'<Δ/>' as XML) as VARCHAR(MAX))
Isso pode resultar em um erro, se a página de código do agrupamento atual não puder representar o caractere Unicode Δ ou representá-lo na codificação específica.
Ao retornar resultados XML para o lado do cliente, os dados serão enviados em codificação UTF-16. O provedor do lado do cliente exporá os dados de acordo com suas regras de API.
Serialização das estruturas XML
O conteúdo de um xml tipo de dados é serializado da maneira usual. Especificamente, os nós de elemento são associados à marcação de elemento, e os nós de texto são associados ao conteúdo de texto. No entanto, as circunstâncias em que os caracteres são entitizados e como os valores atômicos digitados são serializados são descritas nas seções a seguir.
Entitização de caracteres XML durante a serialização
Toda estrutura XML serializada deve ser capaz de ser reparada. Portanto, alguns caracteres precisam ser serializados de forma entitizada para preservar a capacidade de ida e volta dos caracteres através da fase de normalização do analisador XML. No entanto, alguns caracteres têm que ser entitizados para que o documento seja bem formado e, portanto, capaz de ser analisado. A seguir estão as regras de entitização que se aplicam durante a serialização:
Os caracteres &, <e > são sempre entitizados a
&,<e>respectivamente, se ocorrerem dentro de um valor de atributo ou conteúdo de elemento.Como o SQL Server usa aspas (U+0022) para incluir valores de atributo, as aspas em valores de atributo são entitizadas como
".Um par substituto é entitizado como uma única referência de caractere numérico, ao transmitir apenas no servidor. Por exemplo, o par substituto U+D800 U+DF00 é convertido para a referência de caractere numérico
𐌀.Para proteger um TAB (U+0009) e um linefeed (LF, U+000A) de serem normalizados durante a análise, eles são vinculados às suas referências numéricas de caracteres
	e
respectivamente, dentro de valores de atributo.Para evitar que um retorno de carro (CR, U+000D) seja normalizado durante a análise, ele é entitizado à sua referência de caracteres numéricos

dentro dos valores de atributo e do conteúdo do elemento.Para proteger nós de texto que contêm apenas espaço em branco, um dos caracteres de espaço em branco, geralmente o último, é entitizado como sua referência de caractere numérico. Dessa forma, o reprocessamento preserva o nó de texto dos espaços em branco, independentemente da configuração do tratamento de espaços em branco durante a análise.
Por exemplo:
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));
Este é o resultado:
<a a="
𐌀>">
</a>
Se não quiser aplicar a última regra de proteção de espaço em branco, você pode usar a opção explícita CONVERT 1 ao transmitir de xml para uma cadeia de caracteres ou tipo binário. Por exemplo, para evitar a entitização, você pode fazer o seguinte:
SELECT CONVERT(NVARCHAR(50), CONVERT(XML, '<a> </a>', 1), 1);
O método query() (xml Data Type) resulta em uma instância de tipo de dados xml. Portanto, qualquer resultado do método query() que é convertido para uma cadeia de caracteres ou tipo binário é entitizado de acordo com as regras descritas anteriormente. Se quiser obter os valores de cadeia de caracteres que não estão entitizados, use o método value() (xml Data Type) em vez disso. Segue-se um exemplo de utilização do método query():
DECLARE @x xml
SET @x = N'<a>This example contains an entitized char: .</a>'
SELECT @x.query('/a/text()');
Este é o resultado:
This example contains an entitized char: .
Segue-se um exemplo de utilização do método value():
SELECT @x.value('(/a/text())[1]', 'nvarchar(100)');
Este é o resultado:
This example contains an entitized char: .
Serializando um tipo de dados xml tipado
Uma instância de tipo de dados xml digitada contém valores que são digitados de acordo com seus tipos de esquema XML. Esses valores são serializados de acordo com seu tipo de esquema XML no mesmo formato que o XQuery cast to xs:string produz. Para obter mais informações, consulte Regras de Conversão de Tipos no XQuery.
Por exemplo, o valor xs:double 1.34e1 é serializado para 13.4, conforme mostrado no exemplo a seguir:
declare @x xml
set @x =''
select CAST(@x.query('1.34e1') as nvarchar(50));
Isso retorna o valor da cadeia de caracteres 13.4.