Crear instancias de datos XMLCreate Instances of XML Data

SE APLICA A: síSQL Server (a partir de 2008) noAzure SQL Database noAzure SQL Data Warehouse noAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server (starting with 2008) noAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

En este tema se describe cómo generar las instancias XML.This topic describes how to generate XML instances.

En SQL ServerSQL Server, podrá generar instancias XML de las formas siguientes:In SQL ServerSQL Server, you can generate XML instances in the following ways:

  • Instancias de cadenas de conversión de tipo.Type casting string instances.

  • Usar la instrucción SELECT con la cláusula FOR XML.Using the SELECT statement with the FOR XML clause.

  • Usar asignaciones de constantes.Using constant assignments.

  • Usar la carga masiva.Using bulk load.

Instancias de cadenas de conversión de tipo e instancias binariasType Casting String and Binary Instances

Se puede analizar cualquier tipo de datos de cadena de SQL ServerSQL Server , como [n][var]char, [n]text, varbinarye image, en el tipo de datos xml convirtiendo (a través de CAST o CONVERT) la cadena al tipo de datos 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. Se comprueba el XML sin tipo para confirmar que su formato es correcto.Untyped XML is checked to confirm that it is well formed. Si hay un esquema asociado al tipo xml , también se realiza una validación.If there is a schema associated with the xml type, validation is also performed. Para obtener más información, vea Comparar XML con tipo y XML sin tipo.For more information, see Compare Typed XML to Untyped XML.

Los documentos XML pueden codificarse con distintas codificaciones (por ejemplo, UTF-8, UTF-16, windows-1252).XML documents can be encoded with different encodings (for example, UTF-8, UTF-16, windows-1252). A continuación se describen de forma resumida las reglas que establecen el modo en que los tipos de origen de cadena y binarios interactúan con la codificación del documento XML y cómo se comporta el analizador.The following outlines the rules on how the string and binary source types interact with the XML document encoding and how the parser behaves.

Puesto que nvarchar asume una codificación Unicode de dos bytes como UTF-16 o UCS-2, el analizador de XML tratará el valor de cadena como un documento o fragmento XML codificado con Unicode de dos 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. Esto significa que el documento XML también debe codificarse con codificación Unicode de dos bytes para que sea compatible con el tipo de datos de origen.This 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. Un documento XML con codificación UTF-16 puede tener una marca de orden de bytes (BOM) UTF-16, pero no es necesario que la tenga ya que el contexto del tipo de origen indica claramente que solo puede tratarse de un documento con codificación Unicode de dos 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.

El analizador de XML trata el contenido de una cadena varchar como un documento o fragmento XML con codificación de un byte.The content of a varchar string is treated as a one-byte encoded XML document/fragment by the XML parser. Puesto que la cadena de origen varchar tiene una página de códigos asociada, el analizador utilizará dicha página de códigos para la codificación si no se especifica ninguna codificación explícita en el XML. Si una instancia de XML tiene una marca BOM o una declaración de codificación, éstas deben ser coherentes con la página de códigos, de lo contrario el analizador notificará un error.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.

El contenido de varbinary se trata como un flujo de puntos de código que se pasa directamente al analizador de XML.The content of varbinary is treated as a codepoint stream that is passed directly to the XML parser. Por consiguiente, el documento o fragmento XML debe proporcionar la marca BOM u otro tipo de información de codificación insertada.Thus, the XML document or fragment needs to provide the BOM or other encoding information inline. Para determinar la codificación, el analizador solo consultará el flujo.The parser will only look at the stream to determine the encoding. Esto significa que el XML con codificación UTF-16 debe proporcionar la marca BOM UTF-16 y que una instancia sin marca BOM y sin una codificación de declaración se interpretará 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.

Si la codificación del documento XML no se conoce de antemano y los datos se pasan como datos de cadena o datos binarios en lugar de pasarse como datos XML antes de realizar su conversión a XML, es recomendable tratar los datos 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 ejemplo, si se leen datos de un archivo XML usando OpenRowset(), es necesario especificar los datos que deben leerse como un 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 internamente XML en una representación binaria eficaz que usa la codificación UTF-16.internally represents XML in an efficient binary representation that uses UTF-16 encoding. La codificación proporcionada por el usuario no se mantiene, pero se tiene en cuenta durante el proceso de análisis.User-provided encoding is not preserved, but is considered during the parse process.

Conversión de tipos definidos por el usuario CLRType Casting CLR user-defined types

Si un tipo definido por el usuario CLR tiene una serialización XML, las instancias de dicho tipo pueden convertirse explícitamente a un tipo de datos XML.If a CLR user-defined type has an XML Serialization, instances of that type can be explicitly cast to an XML datatype. Para obtener más información sobre la serialización XML de un tipo de datos definido por el usuario CLR, vea Serialización XML de objetos de base de datos de CLR.For more details about the XML serialization of a CLR user-defined typed, see XML Serialization from CLR Database Objects.

Control de los espacios en blanco en XML con tipoWhite Space Handling in Typed XML

En SQL ServerSQL Server, los espacios en blanco en el contenido de los elementos se consideran no significativos si aparecen en una secuencia de datos de caracteres únicamente de espacios en blanco delimitados por caracteres de marcado, como etiquetas iniciales o finales, y no se crea una entidad para los mismos.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. Las secciones CDATA se omiten. Este control de los espacios en blanco es distinto de lo que se describe en la especificación XML 1.0 publicada por el 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). Esto se debe a que el analizador de XML de SQL ServerSQL Server solo reconoce un número limitado de subconjuntos de DTD, tal como se define en 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 obtener más información sobre los subconjuntos de DTD limitados que SQL ServerSQL Server admite, vea CAST y CONVERT (Transact-SQL).For more information about the limited DTD subsets supported in SQL ServerSQL Server, see CAST and CONVERT (Transact-SQL).

De forma predeterminada, el analizador de XML descarta los espacios en blanco insignificantes cuando convierte datos de cadena a XML si se da alguna de las condiciones siguientes:By default, the XML parser discards insignificant white space when it converts string data to XML if either of the following is true:

  • El atributo xml:space no está definido en un elemento o sus elementos antecesores.The xml:space attribute is not defined on an element or its ancestor elements.

  • El atributo xml:space activo en un elemento, o uno de sus elementos antecesores, tiene el valor predeterminado.The xml:space attribute in effect on an element, or one of its ancestor elements, has the value of default.

Por ejemplo:For example:

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

El resultado es el siguiente:This is the result:

<root><child/></root>  

No obstante, puede cambiar este comportamiento.However, you can change this behavior. Para mantener los espacios en blanco de una instancia DT xml, utilice el operador CONVERT y su parámetro style opcional establecido en el valor 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 ejemplo:For example:

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

Si no se utiliza el parámetro style o su valor es 0, no se mantendrán los espacios en blanco insignificantes para la conversión de la instancia 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 obtener más información sobre cómo usar el operador CONVERT y su parámetro style al convertir datos de cadena a instancias DT xml, vea CAST y 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).

Ejemplo: Conversión de un valor de cadena a XML con tipo y asignación a una columnaExample: Cast a string value to typed xml and assign it to a column

En el ejemplo siguiente se convierte una variable de cadena que contiene un fragmento de XML al tipo de datos xml y, a continuación, se almacena en la columna 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>'   

La siguiente operación de inserción se convierte implícitamente de una cadena al tipo xml :The following insert operation implicitly converts from a string to the xml type:

INSERT INTO T VALUES (3, @s)   

Se puede convertir la cadena explícitamente con cast() al tipo xml :You can explicitly cast() the string to the xml type:

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

También se puede utilizar convert(), tal como se muestra a continuación:Or you can use convert(), as shown in the following:

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

Ejemplo: Conversión de una cadena a XML con tipo y asignación a una variableExample: Convert a string to typed xml and assign it to a variable

En el ejemplo siguiente, se convierte una cadena a tipo xml y se asigna a una variable de tipo de datos 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  

Usar la instrucción SELECT con la cláusula FOR XMLUsing the SELECT Statement with a FOR XML Clause

Se puede utilizar la cláusula FOR XML en una instrucción SELECT para devolver resultados como XML.You can use the FOR XML clause in a SELECT statement to return results as XML. Por ejemplo:For example:

DECLARE @xmlDoc xml  
SET @xmlDoc = (SELECT Column1, Column2  
               FROM   Table1, Table2  
               WHERE   Some condition  
               FOR XML AUTO)  
 ...  

La instrucción SELECT devuelve un fragmento de XML de texto que a continuación se analiza durante la asignación a la variable de tipo de datos xml .The SELECT statement returns a textual XML fragment that is then parsed during the assignment to the xml data type variable.

También se puede utilizar la directiva TYPE en la cláusula FOR XML, lo que devuelve directamente un resultado de consulta FOR XML 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  

El resultado es el siguiente:This is the result:

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

En el ejemplo siguiente, el resultado xml con tipo de una consulta FOR XML se inserta en una columna 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 obtener más información sobre FOR XML, vea FOR XML (SQL Server).For more information about FOR XML, see FOR XML (SQL Server).

Nota

SQL ServerSQL Server devuelve instancias de tipo de datos xml al cliente como resultado de las distintas construcciones del servidor, como consultas FOR XML que utilizan la directiva TYPE, o donde se utiliza el tipo de datos xml para devolver XML a partir de parámetros de salida, variables y columnas 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. En el código de la aplicación cliente, el proveedor ADO.NET solicita que la información de tipos de datos xml se envíe en una codificación binaria desde el 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. No obstante, si se está utilizando FOR XML sin la directiva TYPE, los datos XML se devuelven como un tipo de cadena.However, if you are using FOR XML without the TYPE directive, the XML data returns as a string type. En cualquier caso, el proveedor del cliente siempre podrá controlar cualquier formato de tipo XML.In any case, the client provider will always be able to handle either form of XML.

Usar asignaciones de constantesUsing Constant Assignments

Se puede utilizar una constante de cadena cuando se espera una instancia de tipo de datos xml .A string constant can be used where an instance of the xml data type is expected. Es lo mismo que una conversión (CAST) implícita de cadena a XML.This is the same as an implied CAST of string to XML. Por ejemplo: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/>'  

En el ejemplo anterior se convierte implícitamente la cadena al tipo de datos xml y se asigna a una variable de tipo xml .The previous example implicitly converts the string to the xml data type and assigns it to an xml type variable.

En el ejemplo siguiente se inserta una cadena de constante en una columna 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>')   

Nota

El XML con tipo se valida con el esquema especificado.For typed XML, the XML is validated against the specified schema. Para obtener más información, vea Comparar XML con tipo y XML sin tipo.For more information, see Compare Typed XML to Untyped XML.

Usar la carga masivaUsing Bulk Load

La funcionalidad mejorada OPENROWSET (Transact-SQL) permite la carga masiva de documentos XML en la base de datos.The enhanced OPENROWSET (Transact-SQL) functionality allows you to bulk load XML documents in the database. Se pueden cargar de forma masiva instancias XML desde archivos a columnas de tipo xml de la base de datos.You can bulk load XML instances from files into the xml type columns in the database. Para obtener ejemplos prácticos, vea Ejemplos de importación y exportación en bloque documentos XML (SQL Server).For working samples, see Examples of Bulk Import and Export of XML Documents (SQL Server). Para obtener más información sobre cómo cargar documentos XML, vea Cargar datos XML.For more information about loading XML documents, see Load XML Data.

En esta secciónIn This Section

TemaTopic DescripciónDescription
Recuperar y consultar datos XMLRetrieve and Query XML Data Describe las partes de las instancias XML que no se conservan cuando se almacenan en bases de datos.Describes the parts of XML instances that are not preserved when they are stored in databases.

Consulte tambiénSee Also

Comparar XML con tipo y XML sin tipo Compare Typed XML to Untyped XML
Métodos de tipo de datos xml xml Data Type Methods
Lenguaje de manipulación de datos XML (XML DML) XML Data Modification Language (XML DML)
Datos XML (SQL Server)XML Data (SQL Server)