Como todos sabréis, y sino os lo digo yo, SQL Server 2008 (en todas sus versiones) nos ofrece un abanico enorme de posibilidades para realizar cualquier cosa que podamos imaginar sobre una base de datos. En este artículo me centrare en insertar grandes volúmenes de datos en una tabla de una tacada.
Como ya he comentando, tenemos muchísimas posibilidades, pero si los datos están en un fichero externo, es decir, no viene de otra base de datos ya sea en nuestro servidor u otro (enlace al artículo sobre vinculación de servidores), dichas posibilidades se van recortando, aun así, son muchas. Entre ellas y por mi propia experiencia, las que más me gustan son dos: mediante XML y con ficheros delimitados.
En esta ocasión vamos a explicar como lo haríamos con ficheros delimitados, donde nuevamente, tenemos varias posibilidades, siendo la que explicaré a continuación no la mas rápida (de implementar), pero si la más segura y efectiva. Este proceso sería muy útil a la hora de hacer una importación/exportación de datos.
Teniendo la tabla:
01 CREATE TABLE poetas
02 (
03 CODIGO integer not null PRIMARY KEY,
04 NOMBRE VARCHAR(150) not null,
05 APELLIDOS VARCHAR(150) not null,
06 DIRECCION VARCHAR(150) null,
07 LOCALIDAD VARCHAR(150) null,
08 PROVINCIA VARCHAR(150) null
09 )
Y teniendo un fichero con el siguiente formato:
01 1|Gustavo Adolfo|Bécquer| Conde de Barajas|Sevilla|Sevilla##
Donde el carácter "|" es el separador de campos, y los caracteres "##" el separador de linea. Además necesitamos un XML con la definición de campos del fichero a usar relacionándolos con los campos y tipos de las columnas de la tabla donde se van a insertar los datos. El formato sería:
01 <?xml version="1.0"?> 02 03 <BCPFORMAT xmlns="http://schemas.microsoft. 04 com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3. 05 org/2001/XMLSchema-instance"> 06 07 <RECORD> 08 09 <FIELD ID="1" xsi:type="CharTerm" TERMINATOR="|"/> 10 <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="|"/> 11 <FIELD ID="3" xsi:type="CharTerm" TERMINATOR="|"/> 12 <FIELD ID="4" xsi:type="CharTerm" TERMINATOR="|"/> 13 <FIELD ID="5" xsi:type="CharTerm" TERMINATOR="|"/> 14 <FIELD ID="6" xsi:type="CharTerm" TERMINATOR="##"/> 15 16 </RECORD> <ROW> 17 18 <COLUMN SOURCE="1" NAME="CODIGO" xsi:type="SQLSMALLINT"/> 19 <COLUMN SOURCE="2" NAME="NOMBRE" xsi:type="SQLNVARCHAR"/> 20 <COLUMN SOURCE="3" NAME="APELLIDOS" xsi:type="SQLNVARCHAR"/> 21 <COLUMN SOURCE="4" NAME="DIRECCION" xsi:type="SQLNVARCHAR"/> 22 <COLUMN SOURCE="5" NAME="LOCALIDAD" xsi:type="SQLNVARCHAR"/> 23 <COLUMN SOURCE="6" NAME="PROVINCIA" xsi:type="SQLNVARCHAR"/> 24 25 </ROW> </BCPFORMAT>Solo nos faltaría ejecutar una instrucción como esta:
01 INSERT INTO poetas(CODIGO, NOMBRE, APELLIDOS, DIRECCION, LOCALIDAD, PROVINCIA)
02 SELECT CODIGO, NOMBRE, APELLIDOS, DIRECCION, LOCALIDAD, PROVINCIA
03 FROM OPENROWSET(BULK 'C:\exportacion\poetas.txt',
04 FORMATFILE='C:\exportacion\poetas.xml'
05 ) as t1 ;
Aclarar que igual que lo hacemos con una sentencia INSERT, podríamos hacerlo con un UPDATE o un DELETE sin más problemas. También deciros que esta instrucción disparará una sola vez los triggers que tengamos en la tabla, por lo que deberemos programarlos para que traten el conjunto de datos y no solo un registro.
No hay comentarios:
Publicar un comentario