Está en la página 1de 6

Ejemplos de importacin y exportacin de forma masiva documentos XML Puede importar o exportar documentos XML de forma masiva en una

base de datos de SQL Server. Este tema proporciona ejemplos de ambos casos. Para importar datos de forma masiva de un archivo de datos a una tabla o vista sin particiones de SQL Server, puede utilizar lo siguiente: Utilidad bcp Tambin puede usar la utilidad bcp para exportar datos de cualquier ubicacin a una base de datos de SQL Server en la que funcione una instruccin SELECT, incluidas las vistas con particiones. BULK INSERT INSERT ... SELECT * FROM OPENROWSET(BULK...) Para obtener ms informacin, vea Importar y exportar datos masivamente con la utilidad bcp y Importacin masiva de datos mediante BULK INSERT u OPENROWSET(BULK...). Ejemplos Los ejemplos son los siguientes: A. Importar de forma masiva datos XML como una secuencia de bytes binaria B. Importar de forma masiva datos XML en una fila existente C. Importar de forma masiva datos XML a partir de un archivo que contiene una DTD D. Especificar el terminador de campo explcitamente mediante el uso de un archivo de formato E. Exportar de forma masiva datos XML A. Importar de forma masiva datos XML como una secuencia de bytes binaria Cuando importa datos de forma masiva de un archivo que contiene una declaracin de codificacin que desea aplicar, especifique la opcin SINGLE_BLOB en la clusula OPENROWSET(BULK). La opcin SINGLE_BLOB garantiza que el analizador de XML en SQL Server importa los datos segn el esquema de codificacin especificado en la declaracin XML. Tabla de ejemplo Para probar el ejemplo A, debe crear una tabla de ejemplo T. Copiar cdigo USE tempdb CREATE TABLE T (IntCol int, XmlCol xml) GO Archivo de datos de ejemplo Para poder ejecutar el ejemplo A, debe crear un archivo codificado mediante UTF-8 (C:\SampleFolder\SampleData3.txt) que contenga el ejemplo de instancia siguiente que especifica el esquema de codificacin UTF-8. Copiar cdigo <?xml version="1.0" encoding="UTF-8"?> <Root> <ProductDescription ProductModelID="5">

<Summary>Some Text</Summary> </ProductDescription> </Root> Ejemplo A Este ejemplo utiliza la opcin SINGLE_BLOB en una instruccin 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. Copiar cdigo INSERT INTO T(XmlCol) SELECT * FROM OPENROWSET( BULK 'c:\SampleFolder\SampleData3.txt', SINGLE_BLOB) AS x Observaciones Si usa SINGLE_BLOB en este caso, puede evitar una discrepancia entre la codificacin del documento XML (especificada por la declaracin de codificacin XML) y la pgina de cdigos de cadena establecida implcitamente por el servidor. Si utiliza tipos de datos NCLOB o CLOB y se produce un conflicto de pgina de cdigos o de codificacin, deber realizar una de las siguientes acciones: Elimine la declaracin XML para poder importar correctamente el contenido del archivo de datos XML. Especifique una pgina de cdigos en la opcin CODEPAGE de la consulta que coincida con el esquema de codificacin que se utiliza en la declaracin XML. Compare o resuelva los valores de intercalacin de base de datos con un esquema de codificacin XML distinto de Unicode. [Arriba] B. Importar de forma masiva datos XML en una fila existente 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. 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. Archivo de datos de ejemplo El ejemplo B utiliza una versin modificada del archivo de datos de ejemplo SampleData3.txt del ejemplo anterior. Para ejecutar este ejemplo, modifique el contenido de este archivo de la siguiente manera: Copiar cdigo <Root> <ProductDescription ProductModelID="10"> <Summary>Some New Text</Summary> </ProductDescription> </Root>

Ejemplo B Copiar cdigo -- 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 [Arriba] C. Importar de forma masiva datos XML a partir de un archivo que contiene una DTD Nota de seguridad: Se recomienda no habilitar la compatibilidad con definiciones de tipo de documento (DTD) si no es necesaria en el entorno XML. 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 denegacin de servicio. En caso de que sea necesario habilitar la compatibilidad con DTD, este riesgo de seguridad puede reducirse procesando nicamente los documentos XML de confianza. Al intentar utilizar un comando bcp para importar datos XML de un archivo que contenga una DTD, puede producirse un error similar al siguiente: "SQLState = 42000, NativeError = 6359" "Error = [Microsoft][SQL Server Native Client][ SQL Server]No se permite analizar XML con DTD de un subconjunto interno. Utilice CONVERT con la opcin de estilo 2 para habilitar la compatibilidad limitada con DTD de subconjuntos internos." "Error de copia de %s en BCP" Para solucionar este problema, puede importar datos XML de un archivo de datos que contenga una DTD mediante la funcin OPENROWSET(BULK...) y especificando posteriormente la opcin CONVERT en la clusula SELECT del comando. La sintaxis bsica para el comando es la siguiente: INSERT ... SELECT CONVERT() FROM OPENROWSET(BULK...) Archivo de datos de ejemplo Para probar este ejemplo de importacin masiva, cree un archivo (C:\temp\Dtdfile.xml) que contenga la siguiente instancia de ejemplo: Copiar cdigo <!DOCTYPE DOC [<!ATTLIST elem1 attr1 CDATA "defVal1">]><elem1>January</elem1> Tabla de ejemplo

El ejemplo C utiliza la tabla de ejemplo T1 que crea la instruccin CREATE TABLE siguiente: Copiar cdigo USE tempdb CREATE TABLE T1(XmlCol xml); GO Ejemplo C Este ejemplo utiliza OPENROWSET(BULK...) y especifica la opcin CONVERT en la clusula SELECT para importar los datos XML desde Dtdfile.xml al ejemplo de tabla T1. Copiar cdigo INSERT T1 SELECT CONVERT(xml, BulkColumn, 2) FROM OPENROWSET(Bulk 'c:\temp\Dtdfile.xml', SINGLE_BLOB) [rowsetresults] Despus de ejecutar la instruccin INSERT, se quitar la DTD del XML y se almacenar en la tabla T1. [Arriba] D. Especificar el terminador de campo explcitamente mediante el uso de un archivo de formato El ejemplo siguiente muestra cmo importar de forma masiva el siguiente documento XML, Xmltable.dat. Archivo de datos de ejemplo El documento en Xmltable.dat contiene dos valores XML, uno para cada fila. El primer valor XML est codificado con UTF-16 y el segundo con UTF-8. El contenido de este archivo de datos se muestra en el volcado Hex siguiente: Copiar cdigo 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 ejemplo Al realizar una importacin o exportacin masiva de un documento XML, se debe utilizar 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. Este ejemplo muestra cmo utilizar el terminador de campo para la tabla de ejemplo xTable. Para crear esta vista de ejemplo, utilice la siguiente instruccin CREATE TABLE: Copiar cdigo USE tempdb CREATE TABLE xTable (xCol xml); GO Archivo de formato de ejemplo El terminador de campo se debe especificar en el archivo de formato. El ejemplo D utiliza un archivo de formato no XML denominado Xmltable.fmt que contiene lo siguiente: Copiar cdigo 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 instruccin BULK INSERT o INSERT ... SELECT * FROM OPENROWSET(BULK...). Ejemplo D Este ejemplo utiliza el archivo de formato Xmltable.fmt en una instruccin BULK INSERT para importar el contenido de un archivo de datos XML denominado Xmltable.dat. Copiar cdigo BULK INSERT xTable FROM 'C:\Xmltable.dat' WITH (FORMATFILE = 'C:\Xmltable.fmt'); GO [Arriba] E. Exportar de forma masiva datos XML En el ejemplo siguiente se utiliza bcp para realizar la exportacin masiva de datos XML a partir de la tabla creada en el ejemplo anterior con el mismo archivo de formato XML. En el siguiente comando bcp, <server_name> y <instance_name> representan los marcadores de posicin que deben ser reemplazados con los valores adecuados: Copiar cdigo bcp bulktest..xTable out a-wn.out -N -T -S<server_name>\<instance_name> Nota: SQL Server no guarda la codificacin XML cuando se mantienen datos XML en la

base de datos. Por lo tanto, la codificacin original de los campos XML no estar disponible cuando se exporten datos XML. SQL Server utiliza la codificacin UTF-16 al exportar datos XML.
-S server_name[ \instance_name] Especifica la instancia de SQL Server a la que hay que conectarse. Si no se especifica ningn servidor, la utilidad bcp se conecta a la instancia predeterminada de SQL Server en el equipo local. Esta opcin es necesaria cuando se ejecuta un comando bcp desde un equipo remoto de la red o desde una instancia local con nombre. Para establecer una conexin con la instancia predeterminada de SQL Server en un servidor, especifique nicamente server_name. Para conectarse a una instancia con nombre de SQL Server, especifique server_name\instance_name.

bcp empleados format nul -T -c -x -f pruebas.xml

También podría gustarte