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