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
Este artigo descreve como gerar instâncias XML.
No SQL Server, você pode gerar instâncias XML das seguintes maneiras:
- Digite instâncias de cadeia de caracteres de transmissão.
- Usando a instrução
SELECTcom a cláusulaFOR XML. - Usando atribuições constantes.
- Usando carga massiva.
Digite string cast e instâncias binárias
Você pode analisar qualquer um dos tipos de dados de cadeia de caracteres do SQL Server, como [n]varchar, [n]char, [n]text, varbinarye image, no tipo de dados xml convertendo (CAST) ou convertendo (CONVERT) a cadeia de caracteres para o tipo de dados xml. O XML sem tipo definido é verificado para confirmar que está bem formado. Se houver um esquema associado ao tipo de xml, a validação também será executada. Para obter mais informações, consulte Comparar XML tipado com XML não tipado.
Os documentos XML podem ser codificados com codificações diferentes (por exemplo, UTF-8, UTF-16, Windows-1252). A seguir descrevemos as regras sobre como a cadeia de caracteres e os tipos de fonte binária interagem com a codificação de documento XML e como o analisador se comporta.
Como nvarchar assume uma codificação Unicode de 2 bytes, como UTF-16 ou UCS-2, o analisador XML trata o valor da cadeia de caracteres como um documento ou fragmento XML codificado em Unicode de 2 bytes. O documento XML também precisa ser codificado em uma codificação Unicode de 2 bytes para ser compatível com o tipo de dados de origem. Um documento XML codificado em UTF-16 pode ter uma marca de ordem de bytes (BOM) UTF-16, mas não precisa, pois o contexto do tipo de origem deixa claro que ele só pode ser um documento codificado Unicode de 2 bytes.
O conteúdo de uma cadeia de caracteres varchar é tratado como um documento/fragmento XML codificado em 1 byte pelo analisador XML. Como o varchar cadeia de caracteres de origem tem uma página de código associada, o analisador usa essa página de código para a codificação se nenhuma codificação explícita for especificada no próprio XML. Se uma instância XML tiver uma lista técnica ou uma declaração de codificação, a lista técnica ou declaração precisará ser consistente com a página de código, caso contrário, o analisador relatará um erro.
O conteúdo de varbinary é tratado como uma sequência de pontos de código que é passada diretamente para o parser XML. Assim, o documento ou fragmento XML precisa fornecer a lista técnica ou outras informações de codificação embutidas. O analisador só olha para o fluxo para determinar a codificação. Isso significa que o XML codificado em UTF-16 precisa fornecer o BOM do UTF-16, e uma instância sem BOM e sem uma declaração de codificação é interpretada como UTF-8.
Se a codificação do documento XML não for conhecida antecipadamente e os dados forem passados como cadeia de caracteres ou dados binários em vez de dados XML antes de transmitir para XML, você deverá tratar os dados como varbinary. Por exemplo, ao ler dados de um arquivo XML usando OpenRowset(), deve-se especificar os dados a serem lidos como um valor de varbinary(max):
SELECT CAST(x AS XML)
FROM OpenRowset(BULK 'filename.xml', SINGLE_BLOB) R(x);
O SQL Server representa internamente XML em uma representação binária eficiente que usa codificação UTF-16. A codificação fornecida pelo usuário não é preservada, mas é considerada durante o processo de análise.
Conversão de tipos definidos pelo utilizador no CLR
Se um tipo CLR definido pelo usuário tiver uma serialização XML, instâncias desse tipo poderão ser explicitamente convertidas em um tipo de dados XML. Para mais informações sobre a serialização XML de um tipo CLR definido pelo utilizador, consulte Serialização XML de Objetos de Base de Dados CLR.
Manipular espaço em branco em XML digitado
No SQL Server, o espaço em branco dentro do conteúdo do elemento é ignorado se ocorrer dentro de uma sequência de dados de caracteres somente de espaço em branco delimitados por marcação, como marcas de início ou fim, e não é entitizado. (CDATA seções são ignoradas.) Esta forma de manipulação de espaço em branco é diferente de como o espaço em branco é descrito na especificação XML 1.0 publicada pelo Consórcio World Wide Web (W3C). Isso ocorre porque o analisador XML no SQL Server reconhece apenas um número limitado de subconjuntos DTD, conforme definido no XML 1.0. Para obter mais informações sobre os subconjuntos DTD limitados com suporte no SQL Server, consulte CAST e CONVERT.
Por padrão, o analisador XML descarta espaço em branco insignificante quando converte dados de cadeia de caracteres em XML se uma das seguintes opções for verdadeira:
O atributo
xml:spacenão é definido em um elemento ou em seus elementos ancestrais.O atributo
xml:spaceem vigor em um elemento, ou um de seus elementos ancestrais, tem o valor de default.
Por exemplo:
DECLARE @x XML;
SET @x = '<root> <child/> </root>';
SELECT @x;
Aqui está o conjunto de resultados.
<root><child/></root>
No entanto, você pode alterar esse comportamento. Para preservar o espaço em branco para uma instância XML DT, use o operador CONVERT e o parâmetro opcional de estilo definido para o valor 1. Por exemplo:
SELECT CONVERT(XML, N'<root> <child/> </root>', 1);
Se o parâmetro de estilo seja não usado, ou seu valor for definido como 0, o espaço em branco insignificante não será preservado para a conversão da instância DT XML. Para obter mais informações sobre como usar o operador CONVERT e o parâmetro de estilo ao converter texto em instâncias DT xml, consulte CAST e CONVERT.
Exemplo: converter um valor de cadeia de caracteres para XML digitado e atribuí-lo a uma coluna
O exemplo a seguir converte uma variável de cadeia de caracteres que contém um fragmento XML para o tipo de dados xml e, em seguida, armazena-o na coluna xml :
CREATE TABLE T (
c1 INT PRIMARY KEY,
c2 XML
);
GO
DECLARE @s VARCHAR(100);
SET @s = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>';
A seguinte operação de inserção converte implicitamente de uma cadeia de caracteres para o tipo xml :
INSERT INTO T
VALUES (3, @s);
Você pode explicitamente CAST a cadeia de caracteres para o tipo xml :
INSERT INTO T
VALUES (3, CAST(@s AS XML));
Ou você pode usar CONVERT, conforme mostrado no exemplo de código a seguir:
INSERT INTO T
VALUES (3, CONVERT(XML, @s));
Exemplo: converter uma cadeia de caracteres em XML digitado e atribuí-la a uma variável
No exemplo a seguir, uma cadeia de caracteres é convertida em xml do tipo e atribuída a uma variável do tipo de dados xml :
DECLARE @x XML;
DECLARE @s VARCHAR(100);
SET @s = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>';
SET @x = CONVERT(XML, @s);
SELECT @x;
Use a instrução SELECT com uma cláusula FOR XML
Você pode usar a cláusula FOR XML em uma instrução SELECT para retornar resultados como XML. Por exemplo:
DECLARE @xmlDoc XML;
SET @xmlDoc = (
SELECT Column1, Column2
FROM Table1, Table2
WHERE <some_condition>
FOR XML AUTO
)
...;
A instrução SELECT retorna um fragmento XML textual que é analisado durante a atribuição à variável de tipo de dados xml.
Também pode usar a diretiva TYPE nas consultas FOR XML na cláusula FOR XML que retorna diretamente um resultado de consulta FOR XML como tipo de xml:
DECLARE @xmlDoc XML;
SET @xmlDoc = (
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID = 19
FOR XML AUTO, TYPE
);
SELECT @xmlDoc;
Aqui está o conjunto de resultados.
<Production.ProductModel ProductModelID="19" Name="Mountain-100" />...
No exemplo a seguir, o resultado XML digitado de uma consulta FOR XML é inserido em uma coluna do tipo XML :
CREATE TABLE T1 (
c1 INT,
c2 XML
);
GO
INSERT T1 (c1, c2)
SELECT 1, (
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID = 19
FOR XML AUTO, TYPE
);
SELECT *
FROM T1;
GO
Para obter mais informações sobre FOR XML, consulte PARA XML (SQL Server).
Observação
O SQL Server retorna instâncias de tipo de dados xml para o cliente como resultado de diferentes construções do servidor, como consultas FOR XML que utilizam a diretiva TYPE, ou em situações onde o tipo de dados xml é usado para devolver XML a partir de colunas, variáveis e parâmetros de saída no Mecanismo de Banco de Dados do SQL Server. No código da aplicação cliente, o provedor de ADO.NET solicita que estas informações de tipo de dados XML sejam enviadas em uma codificação binária do servidor. No entanto, se você estiver usando FOR XML sem a diretiva TYPE, os dados XML retornarão como um tipo de cadeia de caracteres. Em qualquer caso, o provedor do cliente sempre será capaz de lidar com qualquer forma de XML.
Use atribuições constantes
Uma constante de cadeia de caracteres pode ser usada onde uma instância do tipo de dados xml é esperada. Esta atribuição é igual a uma CAST implícita de string para XML. Por exemplo:
DECLARE @xmlDoc XML;
SET @xmlDoc = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>';
-- Or
SET @xmlDoc = N'<?xml version="1.0" encoding="ucs-2"?><doc/>';
O exemplo anterior converte implicitamente a cadeia de caracteres para o tipo de dados xml e a atribui a uma variável de tipo xml.
O exemplo a seguir insere uma cadeia de caracteres constante em uma coluna xml type:
CREATE TABLE T (
c1 INT PRIMARY KEY,
c2 XML
);
INSERT INTO T
VALUES (3, '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>');
Observação
Para XML tipado, o XML é validado em relação ao esquema especificado. Para obter mais informações, consulte Comparar XML tipado com XML não tipado.
Usar carga em massa
A funcionalidade aprimorada OPENROWSET permite carregar documentos XML em massa no banco de dados. Pode carregar instâncias XML de ficheiros em bloco para as colunas do tipo xml no banco de dados. Para obter exemplos de trabalho, consulte Exemplos de importação e exportação em massa de documentos XML (SQL Server). Para obter mais informações sobre como carregar documentos XML, consulte Carregar dados XML.
Nesta secção
| Artigo | Descrição |
|---|---|
| opções de consulta XML e dados preservados | Descreve as partes de instâncias XML que não são preservadas quando são armazenadas em bancos de dados. |