Criar instâncias de dados XMLCreate Instances of XML Data

APLICA-SE A: SimSQL Server SimBanco de Dados SQL do Azure NãoAzure Synapse Analytics (SQL DW) NãoParallel Data Warehouse APPLIES TO: YesSQL Server YesAzure SQL Database NoAzure Synapse Analytics (SQL DW) NoParallel Data Warehouse

Este tópico descreve como gerar instâncias XML.This topic describes how to generate XML instances.

No SQL ServerSQL Server, você pode gerar instâncias XML das seguintes maneiras:In SQL ServerSQL Server, you can generate XML instances in the following ways:

  • Instâncias de cadeia de caracteres de conversão de tipos.Type casting string instances.

  • Usando a instrução SELECT com a cláusula FOR XML.Using the SELECT statement with the FOR XML clause.

  • Usando atribuições de constantes.Using constant assignments.

  • Usando carregamento em massa.Using bulk load.

Instâncias de cadeia de caracteres de conversão de tipos e bináriasType Casting String and Binary Instances

É possível analisar qualquer um dos tipos de dados de cadeia de caracteres do SQL ServerSQL Server , como [n][var]char, [n]text, varbinarye image, dentro do tipo de dados xml convertendo (CAST) ou (CONVERT) a cadeia de caracteres em tipo de dados xml .You can parse any of the SQL ServerSQL Server string data types, such as [n][var]char, [n]text, varbinary,and image, into the xml data type by casting (CAST) or converting (CONVERT) the string to the xml data type. XML sem-tipo é verificado para confirmar se está bem formado.Untyped XML is checked to confirm that it is well formed. Se houver um esquema associado ao tipo xml , validação também será executada.If there is a schema associated with the xml type, validation is also performed. Para obter mais informações, consulte Comparar XML digitado com XML não digitado.For more information, see Compare Typed XML to Untyped XML.

Documentos de XML podem ser codificados com diferentes codificações (por exemplo, UTF-8, UTF-16, Windows-1252).XML documents can be encoded with different encodings (for example, UTF-8, UTF-16, windows-1252). O seguinte descreve as regras de como os tipos de origem de cadeia de caracteres e binários interagem com a codificação do documento XML e como o analisador se comporta.The following outlines the rules on how the string and binary source types interact with the XML document encoding and how the parser behaves.

Como nvarchar pressupõe uma codificação Unicode de dois bytes, como UTF-16 ou UCS-2, o analisador XML tratará o valor da cadeia de caracteres como um documento ou fragmento XML codificado em Unicode de dois bytes.Since nvarchar assumes a two-byte unicode encoding such as UTF-16 or UCS-2, the XML parser will treat the string value as a two-byte Unicode encoded XML document or fragment. Isso indica que o documento XML precisa ser codificado em uma codificação Unicode bem como ser compatível com o tipo de dados da origemThis means that the XML document needs to be encoded in a two-byte Unicode encoding as well to be compatible with the source data type. Um documento XML codificado em UTF-16 pode ter uma BOM (marca de ordem de byte), mas isso não é necessário, pois o contexto do tipo de origem torna claro que ele pode ser apenas um documento codificado em Unicode de dois bytes.A UTF-16 encoded XML document can have a UTF-16 byte order mark (BOM), but it does not need to, since the context of the source type makes it clear that it can only be a two-byte Unicode encoded document.

O conteúdo de uma cadeia de caracteres varchar é tratado como um documento/fragmento XML codificado em um byte pelo analisador XML.The content of a varchar string is treated as a one-byte encoded XML document/fragment by the XML parser. Como a cadeia de caracteres de origem varchar tem uma página de código associada, o analisador usará 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 BOM ou uma declaração de codificação, a BOM ou declaração precisará ser consistente com a página de código, caso contrário o analisador relatará um erro.Since the varchar source string has a code page associated, the parser will use that code page for the encoding if no explicit encoding is specified in the XML itself If an XML instance has a BOM or an encoding declaration, the BOM or declaration needs to be consistent with the code page, otherwise the parser will report an error.

O conteúdo de varbinary é tratado como um fluxo de codepoint que é passado diretamente ao analisador XML.The content of varbinary is treated as a codepoint stream that is passed directly to the XML parser. Assim, o documento ou fragmento XML precisa fornecer a BOM ou outras informações embutidas de codificação.Thus, the XML document or fragment needs to provide the BOM or other encoding information inline. O analisador examinará o fluxo apenas para determinar a codificação.The parser will only look at the stream to determine the encoding. Isso significa que XML codificado em UTF-16 precisa fornecer a BOM de UTF-16 e que uma instância sem BOM e sem uma codificação de declaração será interpretada como UTF-8.This means that UTF-16 encoded XML needs to provide the UTF-16 BOM and an instance without BOM and without a declaration encoding will be interpreted as UTF-8.

Se a codificação do documento XML não for conhecida antecipadamente e os dados forem passados como cadeias de caracteres ou binários em vez de dados XML antes da conversão em XML, será recomendável tratar os dados como varbinary.If the encoding of the XML document is not known in advance and the data is passed as string or binary data instead of XML data before casting to XML, it is recommended to treat the data as varbinary. Por exemplo, ao ler dados de um arquivo XML usando OpenRowset(), deve-se especificar os dados a serem lidos como um valor varbinary(max) :For example, when reading data from an XML file using OpenRowset(), one should specify the data to be read as a varbinary(max) value:

select CAST(x as XML)   
from OpenRowset(BULK 'filename.xml', SINGLE_BLOB) R(x)  

SQL ServerSQL Server representa XML internamente em uma representação binária eficiente que usa codificação UTF-16.internally represents XML in an efficient binary representation that uses UTF-16 encoding. A codificação fornecida pelo usuário não é preservada, mas é considerada durante o processo de análise.User-provided encoding is not preserved, but is considered during the parse process.

Tipos de dado CLR definidos pelo usuário para conversão de tipoType Casting CLR user-defined types

Se um tipo de dado CLR definido pelo usuário tiver uma serialização XML, as instâncias daquele tipo poderão ser convertidas explicitamente em um tipo de dados XML.If a CLR user-defined type has an XML Serialization, instances of that type can be explicitly cast to an XML datatype. Para obter mais detalhes sobre serialização XML de um tipo da dado CLR definido pelo usuário, consulte Serialização XML de objetos de banco de dados CLR.For more details about the XML serialization of a CLR user-defined typed, see XML Serialization from CLR Database Objects.

Tratamento de espaço em branco em XML com tipoWhite Space Handling in Typed XML

No SQL ServerSQL Server, espaço em branco dentro do conteúdo do elemento será considerado insignificante se ele ocorrer dentro de uma sequência de dados de caracteres de apenas espaço em branco delimitada por marcação, como marcas de início e de fim, e não tiver a entidade definida.In SQL ServerSQL Server, white space inside element content is considered insignificant if it occurs inside a sequence of white-space-only character data delimited by markup, such as begin or end tags, and is not entitized. (Seções de CDATA são ignoradas.) Esse tratamento de espaço em branco é diferente de como o espaço em branco é descrito na especificação do XML 1.0 publicada pelo World Wide Web Consortium (W3C).(CDATA sections are ignored.) This handling of white space handling is different from how white space is described in the XML 1.0 specification published by the World Wide Web Consortium (W3C). Isso é porque o analisador XML no SQL ServerSQL Server reconhece apenas um número limitado de subconjuntos de DTD, conforme definido no XML 1.0.This is because the XML parser in SQL ServerSQL Server recognizes only a limited number of DTD subsets, as defined in XML 1.0. Para obter mais informações sobre os subconjuntos de DTD limitados que têm suporte no SQL ServerSQL Server, consulte CAST e CONVERT (Transact-SQL).For more information about the limited DTD subsets supported in SQL ServerSQL Server, see CAST and CONVERT (Transact-SQL).

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 situações for verdadeira:By default, the XML parser discards insignificant white space when it converts string data to XML if either of the following is true:

  • O atributo xml:space não está definido em um elemento ou em seus elementos ancestrais.The xml:space attribute is not defined on an element or its ancestor elements.

  • O atributo xml:space em efeito em um elemento ou em um de seus elementos ancestrais tem o valor de padrão.The xml:space attribute in effect on an element, or one of its ancestor elements, has the value of default.

Por exemplo:For example:

declare @x xml  
set @x = '<root>      <child/>     </root>'  
select @x   

Este é o resultado:This is the result:

<root><child/></root>  

Porém, é possível alterar esse comportamento.However, you can change this behavior. Para preservar espaço em branco para uma instância DT XML, use o operador CONVERT e seu parâmetro opcional style definido como um valor de 1.To preserve white space for an xml DT instance, use the CONVERT operator and its optional style parameter set to a value of 1. Por exemplo:For example:

SELECT CONVERT(xml, N'<root>      <child/>     </root>', 1)  

Se o parâmetro style não for usado ou seu valor estiver definido como 0, espaço em branco insignificante não será preservado para a conversão da instância DT xml.If the style parameter is either not used or its value is set to 0, insignificant white space is not preserved for the conversion of the xml DT instance. Para obter mais informações sobre como usar o operador CONVERT e seu parâmetro style ao converter dados de cadeia de caracteres em instâncias DT xml, consulte CAST and CONVERT (Transact-SQL).For more information about how to use the CONVERT operator and its style parameter when converting string data to xml DT instances, see CAST and CONVERT (Transact-SQL).

Exemplo: Converter um valor de cadeia de caracteres em xml com tipo e atribuí-lo a uma colunaExample: Cast a string value to typed xml and assign it to a column

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-a na coluna de tipo xml :The following example casts a string variable that contains an XML fragment to the xml data type and then stores it in the xml type column:

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 operação de inserção a seguir converte implicitamente de uma cadeia de caracteres em tipo xml :The following insert operation implicitly converts from a string to the xml type:

INSERT INTO T VALUES (3, @s)   

É possível executar cast() explicitamente na cadeia de caracteres para o tipo xml :You can explicitly cast() the string to the xml type:

INSERT INTO T VALUES (3, cast (@s as xml))  

Ou é possível usar convert(), conforme mostrado a seguir:Or you can use convert(), as shown in the following:

INSERT INTO T VALUES (3, convert (xml, @s))   

Exemplo: Converter uma cadeia de caracteres em xml com tipo e atribuí-la a uma variávelExample: Convert a string to typed xml and assign it to a variable

No exemplo a seguir, uma cadeia de caracteres é convertida em tipo xml e atribuída a uma variável de tipo de dados xml :In the following example, a string is converted to xml type and assigned to a variable of the xml data type:

declare @x xml  
declare  @s varchar(100)  
SET @s = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>'   
set @x =convert (xml, @s)  
select @x  

Usando a instrução SELECT com a cláusula FOR XMLUsing the SELECT Statement with a FOR XML Clause

É possível usar a cláusula FOR XML em uma instrução SELECT para retornar resultados como XML.You can use the FOR XML clause in a SELECT statement to return results as XML. Por exemplo:For example:

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, em seguida, é analisado durante a atribuição à variável de tipo de dados xml .The SELECT statement returns a textual XML fragment that is then parsed during the assignment to the xml data type variable.

Também é possível usar a diretiva TYPE na cláusula FOR XML que retorna um resultado da consulta FOR XML diretamente como tipo xml :You can also use the TYPE directive in the FOR XML clause that directly returns a FOR XML query result as xml type:

Declare @xmlDoc xml  
SET @xmlDoc = (SELECT ProductModelID, Name  
               FROM   Production.ProductModel  
               WHERE  ProductModelID=19  
               FOR XML AUTO, TYPE)  
SELECT @xmlDoc  

Este é o resultado:This is the result:

<Production.ProductModel ProductModelID="19" Name="Mountain-100" />...  

No exemplo a seguir, o resultado xml com tipo de uma consulta FOR XML é inserido em uma coluna de tipo xml:In the following example, the typed xml result of a FOR XML query is inserted into an xml type column:

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 FOR XML (SQL Server).For more information about FOR XML, see FOR XML (SQL Server).

Observação

SQL ServerSQL Server retorna instâncias de tipo de dados xml ao cliente como um resultado das diferentes construções do servidor como consultas FOR XML que usam a diretiva TYPE ou em que o tipo de dados xml é usado para retornar XML de colunas, variáveis e parâmetros de saída SQL.returns xml data type instances to the client as a result of different server constructs such as FOR XML queries that use the TYPE directive, or where the xml data type is used to return XML from SQL columns, variables, and output parameters. No código do aplicativo cliente, o provedor ADO.NET solicita que essas informações de tipo de dados xml sejam enviadas em uma codificação binária do servidor.In client application code, the ADO.NET provider requests that this xml data type information be sent in a binary encoding from the server. Porém, se você estiver usando FOR XML sem a diretiva TYPE, os dados XML retornarão como um tipo de cadeia de caracteres.However, if you are using FOR XML without the TYPE directive, the XML data returns as a string type. De qualquer forma, o provedor cliente sempre poderá controlar qualquer formulário de XML.In any case, the client provider will always be able to handle either form of XML.

Usando atribuições de constantesUsing Constant Assignments

Uma constante de cadeia de caracteres pode ser usada onde uma instância do tipo de dados xml é esperada.A string constant can be used where an instance of the xml data type is expected. Isso é o mesmo que uma CAST implícita de cadeia de caracteres em XML.This is the same as an implied CAST of string to XML. Por exemplo:For example:

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 no tipo de dados xml e a atribui a uma variável de tipo xml .The previous example implicitly converts the string to the xml data type and assigns it to an xml type variable.

O exemplo a seguir insere uma cadeia de caracteres constante em uma coluna de tipo xml :The following example inserts a constant string into an xml type column:

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 com tipo, o XML é validado em relação ao esquema especificado.For typed XML, the XML is validated against the specified schema. Para obter mais informações, consulte Comparar XML digitado com XML não digitado.For more information, see Compare Typed XML to Untyped XML.

Usando carregamento em massaUsing Bulk Load

A funcionalidade OPENROWSET (Transact-SQL) aprimorada permite carregar documentos XML em massa no banco de dados.The enhanced OPENROWSET (Transact-SQL) functionality allows you to bulk load XML documents in the database. É possível carregar instâncias XML em massa de arquivos em colunas de tipo xml no banco de dados.You can bulk load XML instances from files into the xml type columns in the database. Para obter exemplos de funcionamento, consulte Exemplos de importação e exportação em massa de documentos XML (SQL Server).For working samples, see Examples of Bulk Import and Export of XML Documents (SQL Server). Para obter mais informações sobre carregamento de documentos XML, consulte Carregar dados XML.For more information about loading XML documents, see Load XML Data.

Nesta seçãoIn This Section

TópicoTopic DESCRIÇÃODescription
Recuperar e consultar dados XMLRetrieve and Query XML Data Descreve as partes de instâncias XML que não são preservadas quando são armazenadas em bancos de dados.Describes the parts of XML instances that are not preserved when they are stored in databases.

Consulte TambémSee Also

Comparar XML digitado com XML não digitado Compare Typed XML to Untyped XML
Métodos de tipos de dados xml xml Data Type Methods
Linguagem de modificação de dados XML (XML DML) XML Data Modification Language (XML DML)
Dados XML (SQL Server)XML Data (SQL Server)