Ejemplos de importación y exportación de forma masiva documentos XML (SQL Server)Examples of Bulk Import and Export of XML Documents (SQL Server)

ESTE TEMA SE APLICA A: síSQL Server (a partir de 2016)noBase de datos SQL de AzurenoAlmacenamiento de datos SQL de Azure noAlmacenamiento de datos paralelosTHIS TOPIC APPLIES TO: yesSQL Server (starting with 2016)noAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Puede importar documentos XML de forma masiva en una base de datos de SQL ServerSQL Server o exportarlos de igual forma desde una base de datos de SQL ServerSQL Server .You can bulk import XML documents into a SQL ServerSQL Server database or bulk export them from a SQL ServerSQL Server database. Este tema proporciona ejemplos de ambos casos.This topic provides examples of both.

Para importar datos de forma masiva de un archivo de datos a una tabla o vista sin particiones de SQL ServerSQL Server , puede utilizar lo siguiente:To bulk import data from a data file into a SQL ServerSQL Server table or non-partitioned view, you can use the following:

EjemplosExamples

Los ejemplos son los siguientes:The examples are the following:

Importar de forma masiva datos XML como un flujo de bytes binarioBulk importing XML data as a binary byte stream

Cuando importa datos de forma masiva de un archivo que contiene una declaración de codificación que desea aplicar, especifique la opción SINGLE_BLOB en la cláusula OPENROWSET(BULK…).When you bulk import XML data from a file that contains an encoding declaration that you want to apply, specify the SINGLE_BLOB option in the OPENROWSET(BULK…) clause. La opción SINGLE_BLOB garantiza que el analizador de XML de SQL ServerSQL Server importa los datos según el esquema de codificación especificado en la declaración XML.The SINGLE_BLOB option ensures that the XML parser in SQL ServerSQL Server imports the data according to the encoding scheme specified in the XML declaration.

Tabla de ejemploSample Table

Para probar el ejemplo A de aquí, debe crear una tabla de ejemplo T.To test example A below, create sample table T.

USE tempdb  
CREATE TABLE T (IntCol int, XmlCol xml);  
GO  

Archivo de datos de ejemploSample Data File

Para poder ejecutar el ejemplo A, debe crear un archivo codificado con UTF-8 (C:\SampleFolder\SampleData3.txt) que contenga el ejemplo de instancia siguiente que especifica el esquema de codificación UTF-8 .Before you can run example A, you must create a UTF-8 encoded file (C:\SampleFolder\SampleData3.txt) that contains the following sample instance that specifies the UTF-8 encoding scheme.

\<?xml version="1.0" encoding="UTF-8"?>  
<Root>  
          <ProductDescription ProductModelID="5">  
             <Summary>Some Text</Summary>  
          </ProductDescription>  
</Root>  

Ejemplo AExample A

Este ejemplo utiliza la opción SINGLE_BLOB en una instrucción INSERT ... SELECT * FROM OPENROWSET(BULK...) para importar datos de un archivo llamado SampleData3.txt e insertar una instancia XML en la tabla de ejemplo de una sola columna T.This example uses the SINGLE_BLOB option in an INSERT ... SELECT * FROM OPENROWSET(BULK...) statement to import data from a file named SampleData3.txt and insert an XML instance in the single-column table, sample table T.

INSERT INTO T(XmlCol)  
SELECT * FROM OPENROWSET(  
   BULK 'c:\SampleFolder\SampleData3.txt',  
   SINGLE_BLOB) AS x;  

ComentariosRemarks

Si usa SINGLE_BLOB en este caso, puede evitar una discrepancia entre la codificación del documento XML (especificada por la declaración de codificación XML) y la página de códigos de cadena establecida implícitamente por el servidor.By using SINGLE_BLOB in this case, you can avoid a mismatch between the encoding of the XML document (as specified by the XML encoding declaration) and the string codepage implied by the server.

Si utiliza tipos de datos NCLOB o CLOB y se produce un conflicto de página de códigos o de codificación, deberá realizar una de las siguientes acciones:If you use NCLOB or CLOB data types and run into a codepage or encoding conflict, you must do one of the following:

  • Elimine la declaración XML para poder importar correctamente el contenido del archivo de datos XML.Remove the XML declaration to successfully import the contents of the XML data file.

  • Especifique una página de códigos en la opción CODEPAGE de la consulta que coincida con el esquema de codificación que se utiliza en la declaración XML.Specify a code page in the CODEPAGE option of the query that matches the encoding scheme that is used in the XML declaration.

  • Compare o resuelva los valores de intercalación de base de datos con un esquema de codificación XML distinto de Unicode.Match, or resolve, the database collation settings with a non-Unicode XML encoding scheme.

    [Principio][Top]

Importar de forma masiva datos XML en una fila existente Bulk importing XML data in an existing row

Este ejemplo utiliza el el proveedor de conjuntos de filas BULK OPENROWSET para agregar una instancia XML a una fila o filas existentes en la tabla de ejemplo T.This example uses the OPENROWSET bulk rowset provider to add an XML instance to an existing row or rows in sample table T.

Nota

Para ejecutar este ejemplo, es necesario que complete primero el script de prueba del ejemplo A. Ese ejemplo crea la tabla tempdb.dbo.T e importa los datos de forma masiva de SampleData3.txt.To run this example, you must first complete the test script provided in example A. That example creates the tempdb.dbo.T table and bulk imports data from SampleData3.txt.

Archivo de datos de ejemploSample Data File

El ejemplo B utiliza una versión modificada del archivo de datos de ejemplo SampleData3.txt del ejemplo anterior.Example B uses a modified version of the SampleData3.txt sample data file from the preceding example. Para ejecutar este ejemplo, modifique el contenido de este archivo de la siguiente manera:To run this example, modify the content of this file as follows:

<Root>  
          <ProductDescription ProductModelID="10">  
             <Summary>Some New Text</Summary>  
          </ProductDescription>  
</Root>  

Ejemplo BExample B

-- Query before update shows initial state of XmlCol values.  
SELECT * FROM T  
UPDATE T  
SET XmlCol =(  
SELECT * FROM OPENROWSET(  
   BULK 'C:\SampleFolder\SampleData3.txt',  
           SINGLE_BLOB  
) AS x  
)  
WHERE IntCol = 1;  
GO  

[Principio][Top]

Importar de forma masiva datos XML a partir de un archivo que contiene una DTD Bulk importing XML data from a file that contains a DTD

Importante

Se recomienda no habilitar la compatibilidad con definiciones de tipo de documento (DTD) si no es necesaria en el entorno XML.We recommended that you not enable support for Document Type Definitions (DTDs) if it is not required in your XML environment. Si se activa la compatibilidad con DTD, se aumenta el área expuesta susceptible de ataques del servidor, que puede quedar expuesta a un ataque por denegación de servicio.Turning on DTD support increases the attackable surface area of your server, and may expose it to a denial-of-service attack. En caso de que sea necesario habilitar la compatibilidad con DTD, este riesgo de seguridad puede reducirse procesando únicamente los documentos XML de confianza.If you must enable DTD support, you can reduce this security risk by processing only trusted XML documents.

Al intentar utilizar un comando bcp para importar datos XML de un archivo que contenga una DTD, puede producirse un error similar al siguiente:During an attempt to use a bcp command to import XML data from a file that contains a DTD, an error similar to the following can occur:

"SQLState = 42000, NativeError = 6359""SQLState = 42000, NativeError = 6359"

"Error = [Microsoft][SQL Server Native Client][ SQL Server]No se permite analizar XML con DTD de un subconjunto interno."Error = [Microsoft][SQL Server Native Client][ SQL Server]Parsing XML with internal subset DTDs not allowed. Utilice CONVERT con la opción de estilo 2 para habilitar la compatibilidad limitada con DTD de subconjuntos internos."Use CONVERT with style option 2 to enable limited internal subset DTD support."

"Error de copia de %s en BCP""BCP copy %s failed"

Para solucionar este problema, puede importar datos XML de un archivo de datos que contenga una DTD mediante la función OPENROWSET(BULK...) y especificando posteriormente la opción CONVERT en la cláusula SELECT del comando.To work around this problem, you can import XML data from a data file that contains a DTD by using the OPENROWSET(BULK...) function and then specifying the CONVERT option in the SELECT clause of the command. La sintaxis básica para el comando es la siguiente:The basic syntax for the command is:

INSERT ... SELECT CONVERT(…) FROM OPENROWSET(BULK...)

Archivo de datos de ejemploSample Data File

Para probar este ejemplo de importación en bloque, cree un archivo (C:\temp\Dtdfile.xml) que contenga la siguiente instancia de ejemplo:Before you can test this bulk import example, create a file (C:\temp\Dtdfile.xml) that contains the following sample instance:

<!DOCTYPE DOC [<!ATTLIST elem1 attr1 CDATA "defVal1">]><elem1>January</elem1>  

Tabla de ejemploSample Table

El ejemplo C utiliza la tabla de ejemplo T1 que crea la instrucción CREATE TABLE siguiente:Example C uses the T1 sample table that is created by the following CREATE TABLE statement:

USE tempdb;  
CREATE TABLE T1(XmlCol xml);  
GO  

Ejemplo CExample C

Este ejemplo utiliza OPENROWSET(BULK...) y especifica la opción CONVERT en la cláusula SELECT para importar los datos XML desde Dtdfile.xml al ejemplo de tabla T1.This example uses OPENROWSET(BULK...) and specifies the CONVERT option in the SELECT clause to import the XML data from Dtdfile.xml into sample table T1.

INSERT T1  
  SELECT CONVERT(xml, BulkColumn, 2) FROM   
    OPENROWSET(Bulk 'c:\temp\Dtdfile.xml', SINGLE_BLOB) [rowsetresults];  

Después de ejecutar la instrucción INSERT , se quitará la DTD del XML y se almacenará en la tabla T1 .After the INSERT statement executes, the DTD is stripped from the XML and stored in the T1 table.

[Principio][Top]

Especificar el terminador de campo explícitamente mediante el uso de un archivo de formato Specifying the field terminator explicitly using a format file

El ejemplo siguiente muestra cómo importar de forma masiva el siguiente documento XML, Xmltable.dat.The following example shows how to bulk import the following XML document, Xmltable.dat.

Archivo de datos de ejemploSample Data File

El documento en Xmltable.dat contiene dos valores XML, uno para cada fila.The document in Xmltable.dat contains two XML values, one for each row. El primer valor XML está codificado con UTF-16 y el segundo con UTF-8.The first XML value is encoded with UTF-16, and the second value is encoded with UTF-8.

El contenido de este archivo de datos se muestra en el volcado Hex siguiente:The contents of this data file are shown in the following Hex dump:

FF FE 3C 00 3F 00 78 00-6D 00 6C 00 20 00 76 00  *..\<.?.x.m.l. .v.*  
65 00 72 00 73 00 69 00-6F 00 6E 00 3D 00 22 00  *e.r.s.i.o.n.=.".*  
31 00 2E 00 30 00 22 00-20 00 65 00 6E 00 63 00  *1...0.". .e.n.c.*  
6F 00 64 00 69 00 6E 00-67 00 3D 00 22 00 75 00  *o.d.i.n.g.=.".u.*  
74 00 66 00 2D 00 31 00-36 00 22 00 3F 00 3E 00  *t.f.-.1.6.".?.>.*  
3C 00 72 00 6F 00 6F 00-74 00 3E 00 A2 4F 9C 76  *\<.r.o.o.t.>..O.v*  
0C FA 77 E4 80 00 89 00-00 06 90 06 91 2E 9B 2E  *..w.............*  
99 34 A2 34 86 00 83 02-92 20 7F 02 4E C5 E4 A3  *.4.4..... ..N...*  
34 B2 B7 B3 B7 FE F8 FF-F8 00 3C 00 2F 00 72 00  *4.........\<./.r.*  
6F 00 6F 00 74 00 3E 00-00 00 00 00 7A EF BB BF  *o.o.t.>.....z...*  
3C 3F 78 6D 6C 20 76 65-72 73 69 6F 6E 3D 22 31  *\<?xml version="1*  
2E 30 22 20 65 6E 63 6F-64 69 6E 67 3D 22 75 74  *.0" encoding="ut*  
66 2D 38 22 3F 3E 3C 72-6F 6F 74 3E E4 BE A2 E7  *f-8"?><root>....*  
9A 9C EF A8 8C EE 91 B7-C2 80 C2 89 D8 80 DA 90  *................*  
E2 BA 91 E2 BA 9B E3 92-99 E3 92 A2 C2 86 CA 83  *................*  
E2 82 92 C9 BF EC 95 8E-EA 8F A4 EB 88 B4 EB 8E  *................*  
B7 EF BA B7 EF BF B8 C3-B8 3C 2F 72 6F 6F 74 3E  *.........</root>*  
00 00 00 00 7A                                   *....z*  

Tabla de ejemploSample Table

Al realizar una importación o exportación masiva de un documento XML, hay que usar un terminador de campo que no pueda aparecer en ninguno de los documentos; por ejemplo, una serie de cuatro valores NULL (\0) seguidos de la letra z: \0\0\0\0z.When you bulk import or export an XML document, you should use a field terminator that cannot possibly appear in any of the documents; for example, a series of four nulls (\0) followed by the letter z: \0\0\0\0z.

Este ejemplo muestra cómo utilizar el terminador de campo para la tabla de ejemplo xTable .This example shows how to use this field terminator for the xTable sample table. Para crear esta vista de ejemplo, utilice la siguiente instrucción CREATE TABLE :To create this sample table, use the following CREATE TABLE statement:

USE tempdb;  
CREATE TABLE xTable (xCol xml);  
GO  

Archivo de formato de ejemploSample Format File

El terminador de campo se debe especificar en el archivo de formato.The field terminator must be specified in the format file. El ejemplo D utiliza un archivo de formato no XML denominado Xmltable.fmt que contiene lo siguiente:Example D uses a non-XML format file named Xmltable.fmt that contains the following:

9.0  
1  
1       SQLBINARY     0       0       "\0\0\0\0z"    1     xCol         ""  

Puede utilizar este archivo de formato para realizar importaciones masivas de documentos XML a la tabla xTable mediante el comando bcp o una instrucción BULK INSERT o INSERT ... SELECT * FROM OPENROWSET(BULK...) .You can use this format file to bulk import XML documents into the xTable table by using a bcp command or a BULK INSERT or INSERT ... SELECT * FROM OPENROWSET(BULK...) statement.

Ejemplo DExample D

Este ejemplo utiliza el archivo de formato Xmltable.fmt en una instrucción BULK INSERT para importar el contenido de un archivo de datos XML denominado Xmltable.dat.This example uses the Xmltable.fmt format file in a BULK INSERT statement to import the contents of an XML data file named Xmltable.dat.

BULK INSERT xTable   
FROM 'C:\Xmltable.dat'  
WITH (FORMATFILE = 'C:\Xmltable.fmt');  
GO  

[Principio][Top]

Exportar de forma masiva datos XML Bulk exporting XML data

En el ejemplo siguiente se utiliza bcp para realizar la exportación masiva de datos XML a partir de la tabla creada en el ejemplo anterior con el mismo archivo de formato XML.The following example uses bcp to bulk export XML data from the table that is created in the preceding example by using the same XML format file. En el siguiente comando bcp , <server_name> y <instance_name> representan los marcadores de posición que deben ser reemplazados con los valores adecuados:In the following bcp command, <server_name> and <instance_name> represent placeholders that must be replaced with appropriate values:

bcp bulktest..xTable out a-wn.out -N -T -S<server_name>\<instance_name>  
Nota

SQL ServerSQL Server no guarda la codificación XML cuando se mantienen datos XML en la base de datos. SQL ServerSQL Server does not save the XML encoding when XML data is persisted in the database. Por lo tanto, la codificación original de los campos XML no estará disponible cuando se exporten datos XML.Therefore, the original encoding of XML fields is not available when XML data is exported. SQL ServerSQL Server usa la codificación UTF-16 al exportar datos XML. uses UTF-16 encoding when exporting XML data.

Vea tambiénSee Also

INSERT (Transact-SQL) INSERT (Transact-SQL)
SELECT (cláusula de Transact-SQL) SELECT Clause (Transact-SQL)
bcp (utilidad) bcp Utility
Importar y exportar datos en bloque (SQL Server) Bulk Import and Export of Data (SQL Server)
BULK INSERT (Transact-SQL) BULK INSERT (Transact-SQL)
OPENROWSET (Transact-SQL) OPENROWSET (Transact-SQL)