Saltar al contenido

Exportar tabla a archivo con encabezados de columna (nombres de columna) usando la utilidad bcp y SQL Server 2008

Este team de trabajo ha pasado horas buscando respuestas a tus interrogantes, te compartimos la soluciones así que esperamos que te sea de gran ayuda.

Solución:

Este método genera automáticamente los nombres de las columnas con los datos de sus filas mediante BCP.

El script escribe un archivo para los encabezados de columna (leer de INFORMATION_SCHEMA.COLUMNS table) luego agrega otro archivo con los datos de la tabla.

La salida final se combina en TableData.csv que tiene los encabezados y los datos de la fila. Simplemente reemplace las variables de entorno en la parte superior para especificar el nombre del servidor, la base de datos y la tabla.

set BCP_EXPORT_SERVER=put_my_server_name_here
set BCP_EXPORT_DB=put_my_db_name_here
set BCP_EXPORT_TABLE=put_my_table_name_here

BCP "DECLARE @colnames VARCHAR(max);SELECT @colnames = COALESCE(@colnames + ',', '') + column_name from %BCP_EXPORT_DB%.INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='%BCP_EXPORT_TABLE%'; select @colnames;" queryout HeadersOnly.csv -c -T -S%BCP_EXPORT_SERVER%

BCP %BCP_EXPORT_DB%.dbo.%BCP_EXPORT_TABLE% out TableDataWithoutHeaders.csv -c -t, -T -S%BCP_EXPORT_SERVER%

set BCP_EXPORT_SERVER=
set BCP_EXPORT_DB=
set BCP_EXPORT_TABLE=

copy /b HeadersOnly.csv+TableDataWithoutHeaders.csv TableData.csv

del HeadersOnly.csv
del TableDataWithoutHeaders.csv

Tenga en cuenta que si necesita proporcionar credenciales, reemplace la opción -T con -U my_username -P my_password

Este método tiene la ventaja de tener siempre los nombres de las columnas sincronizados con la tabla mediante el uso de INFORMATION_SCHEMA.COLUMNS. La desventaja es que crea archivos temporales. Microsoft realmente debería arreglar la utilidad bcp para admitir esto.

Esta solución utiliza el truco de concatenación de filas SQL de aquí combinado con las ideas de bcp de aquí

Lo más fácil es utilizar el queryout opción y uso union all para vincular una lista de columnas con el contenido real de la tabla

    bcp "select 'col1', 'col2',... union all select * from myschema.dbo.myTableout" queryout myTable.csv /SmyServer01 /c /t, -T

Un ejemplo:

create table Question1355876
(id int, name varchar(10), someinfo numeric)

insert into Question1355876
values (1, 'a', 123.12)
     , (2, 'b', 456.78)
     , (3, 'c', 901.12)
     , (4, 'd', 353.76)

Esta consulta devolverá la información con los encabezados como primera fila (tenga en cuenta las conversiones de los valores numéricos):

select 'col1', 'col2', 'col3'
union all
select cast(id as varchar(10)), name, cast(someinfo as varchar(28))
from Question1355876

El comando bcp será:

bcp "select 'col1', 'col2', 'col3' union all select cast(id as varchar(10)), name, cast(someinfo as varchar(28)) from Question1355876" queryout myTable.csv /SmyServer01 /c /t, -T

Una buena alternativa es SqlCmd, ya que incluye encabezados, pero tiene la desventaja de agregar espacio de relleno alrededor de los datos para facilitar la lectura humana. Puede combinar SqlCmd con la utilidad sed (edición de flujo) GnuWin32 para limpiar los resultados. Aquí hay un ejemplo que funcionó para mí, aunque no puedo garantizar que sea a prueba de balas.

Primero, exporte los datos:

sqlcmd -S Server -i C:TempQuery.sql -o C:TempResults.txt -s"    "

los -s" " es un carácter de tabulación entre comillas dobles. Descubrí que debe ejecutar este comando a través de un archivo por lotes; de lo contrario, el símbolo del sistema de Windows tratará la pestaña como un comando de finalización automática y sustituirá un nombre de archivo en lugar de la pestaña.

Si Query.sql contiene:

SELECT name, object_id, type_desc, create_date
FROM MSDB.sys.views
WHERE name LIKE 'sysmail%'

luego verá algo como esto en Results.txt

name                                          object_id   type_desc           create_date            
-------------------------------------------   ----------- ------------------- -----------------------
sysmail_allitems                               2001442204 VIEW                2012-07-20 17:38:27.820
sysmail_sentitems                              2017442261 VIEW                2012-07-20 17:38:27.837
sysmail_unsentitems                            2033442318 VIEW                2012-07-20 17:38:27.850
sysmail_faileditems                            2049442375 VIEW                2012-07-20 17:38:27.860
sysmail_mailattachments                        2097442546 VIEW                2012-07-20 17:38:27.933
sysmail_event_log                              2129442660 VIEW                2012-07-20 17:38:28.040

(6 rows affected)

A continuación, analice el texto usando sed:

sed -r "s/ +t/t/g" C:TempResults.txt | sed -r "s/t +/t/g" | sed -r "s/(^ +| +$)//g" | sed 2d | sed $d | sed "/^$/d" > C:TempResults_New.txt

Tenga en cuenta que el 2d comando significa eliminar la segunda línea, el $d comando significa eliminar la última línea, y "/^$/d" elimina las líneas en blanco.

El archivo limpiado se ve así (aunque reemplacé las pestañas con | para que puedan visualizarse aquí):

name|object_id|type_desc|create_date
sysmail_allitems|2001442204|VIEW|2012-07-20 17:38:27.820
sysmail_sentitems|2017442261|VIEW|2012-07-20 17:38:27.837
sysmail_unsentitems|2033442318|VIEW|2012-07-20 17:38:27.850
sysmail_faileditems|2049442375|VIEW|2012-07-20 17:38:27.860
sysmail_mailattachments|2097442546|VIEW|2012-07-20 17:38:27.933
sysmail_event_log|2129442660|VIEW|2012-07-20 17:38:28.040

Comentarios y calificaciones

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *