Necesitamos escribir los resultados de la consulta SELECT en un archivo csv. ¿Cómo se puede hacer usando T-SQL en SQL Server 2008 r2? Sé que se puede hacer en SSIS, pero por algunas razones, no tenemos esta opción.
Intenté usar el proceso sugerido en el artículo siguiente, pero cuando ejecuto el proceso, SQL se queja de que «no puede ejecutar sys.sp_OACreate y sys.sp_OADestroy que se llaman en este proceso.
¿Sabe cómo podemos activar estos componentes o conoce alguna forma mejor de escribir en un archivo usando T-SQL?
Gracias de antemano.
Responder
Utilice Utilidad BCP
bcp "SELECT Col1,Col2,Col3 FROM MyDatabase.dbo.MyTable" queryout "D:\MyTable.csv" -c -t , -S SERVERNAME -T
El argumento -c
especifica c salida de caracteres, a diferencia del formato binario nativo de SQL; este valor predeterminado es valores separados por tabulaciones, pero -t ,
cambia el campo t erminator a comas. -T
especifica la autenticación de Windows (« t conexión oxidada «); de lo contrario, utilice -U MyUserName -P MyPassword
.
Esto no exporta encabezados de columna por defecto. Debe usar UNION ALL para los encabezados
O
Use SQLCMD
SQLCMD -S SERVERNAME -E -Q "SELECT Col1,Col2,Col3 FROM MyDatabase.dbo.MyTable" -s "," -o "D:\MyData.csv"
O
Utilice Powershell
Aquí hay un enlace a un artículo . Si terminas usando esto, es posible que desees agregar -notype
después de Export-Csv $extractFile
para eliminar la columna innecesaria en el archivo de salida.
Comentarios
- +1 Para la utilidad BCP – es muy fácil de usar, es la herramienta más rápida que he usado para exportar / importar información y hay muchas opciones. Le aconsejo que agregue » > FileName.log » al final del declaración: esto creará un archivo de registro.
- Cualquier respuesta que involucre un programa GUI simplemente está fuera de alcance. ¡Esta es la mejor solución desde el punto de vista de un DBA!
Respuesta
Añadiendo a la respuesta anterior, que te ayuda a automatizar la acción, si lo necesitas solo de vez en cuando puedes hacerlo en Management Studio, simplemente haz clic derecho en el encabezado – Guardar resultados como -> elige un. csv file .
O si desea hacer eso para cada instrucción de selección que ejecute, puede cambiar la dirección de salida de los resultados a un archivo. Utilice Herramientas -> Opciones -> Resultados de la consulta – Resultados al archivo .
De otra forma, puede automatizarse fácilmente y hacer uso de SSIS mediante la función Exportar datos de Management Studio. Haga clic derecho en la base de datos -> Tareas -> Exportar datos. Hay un asistente con muchas opciones. Debe elegir la base de datos de origen, el destino y otras opciones. Para el destino, asegúrese de que sea «Archivo plano», busque y elija el tipo .csv , elija el formato que necesite y al final obtendrá un paquete SSIS que se puede guardar localmente y repetir según sea necesario.
Responder
Use T-SQL
INSERT INTO OPENROWSET("Microsoft.ACE.OLEDB.12.0","Text;Database=D:\;HDR=YES;FMT=Delimited","SELECT * FROM [FileName.csv]") SELECT Field1, Field2, Field3 FROM DatabaseName
Pero, hay un par de advertencias:
- Debe tener el proveedor Microsoft.ACE.OLEDB.12.0 disponible. El proveedor Jet 4.0 también funcionará, pero es antiguo, así que usé este en su lugar.
- El archivo .CSV ya tendrá que existir. Si estás usando encabezados (HDR = YES) , asegúrese de que la primera línea del archivo .CSV sea una lista delimitada de todos los campos.
Comentarios
- La mejor respuesta ¡lejos!
- gran trabajo incluyendo advertencias
- Una advertencia más: es posible que necesite permisos, de lo contrario verá: Msg 15281, Nivel 16, Estado 1, Línea 2 SQL Server bloqueó el acceso a DECLARACIÓN ‘ OpenRowset / OpenDatasource ‘ del componente ‘ Consultas distribuidas ad hoc ‘ porque este componente está desactivado como parte de la configuración de seguridad de este servidor. Un administrador del sistema puede habilitar el uso de ‘ consultas distribuidas ad hoc ‘ mediante sp_configure. Para obtener más información sobre cómo habilitar ‘ consultas distribuidas ad hoc ‘, busque ‘ ad hoc Consultas distribuidas ‘ en los Libros en pantalla de SQL Server.
Respuesta
Baja tecnología, pero …
select col1 + "," + cast(col2 as varchar(10)) + "," + col3 from mytable;
Comentarios
- MySQL trata
col1 + ',' + cast(col2 as varchar(10)) + ',' + col3
como nombre de columna e imprime NULL en todo el lugar.
Respuesta
Parece que ya tiene una solución aceptable, pero si tiene db mail configurado potencialmente podría hacer algo como esto:
EXEC msdb.dbo.sp_send_dbmail @recipients="[email protected]", @subject="CSV Extract", @body="See attachment", @query ="SELECT Col1,Col2,Col3 FROM MyDatabase.dbo.MyTable", @attach_query_result_as_file = 1, @query_attachment_filename = "CSV_Extract.txt", @query_result_separator = ",", @query_result_header = 1
Si está enviando el archivo por correo electrónico a algún lugar de todos modos, podría ahorrarle algunos pasos.
Comentarios
- Justo lo que estaba buscando, ¡felicitaciones!
- Aunque necesitará agregar el parámetro @profile_name si no tiene un perfil privado predeterminado para su usuario ni perfil público para la base de datos.
Respuesta
Esto se puede hacer fácilmente en 3 pasos proceso:
-
Escriba su consulta como una
SELECT INTO
consulta. Básicamente, esto exportará los resultados de la consulta a una tabla.Select Field1 ,Field2 ,Field3 INTO dbo.LogTableName --Table where the query Results get logged into. From Table
Tenga en cuenta que esta tabla no puede existen cuando se ejecuta la consulta, ya que este tipo de consulta quiere crear la tabla como parte de la ejecución.
-
Luego use SSIS para exportar los resultados de esa tabla a
.csv
. El asistente de exportación SSIS le permite elegir su delimitador, etc. Esto es muy útil para usar un | delimitador en instancias donde el conjunto de resultados contiene comas.Haga clic derecho en
DB Name > Tasks > Export Data
-
Una vez que se complete la exportación, ejecute el
DROP TABLE
comando para limpiar su tabla de registro.Drop Table dbo.LogTableName
Comentarios
- Hola Don. Agregué algo de formato a tu respuesta. Puede hacer clic en ‘ edit ‘ en la parte inferior izquierda para ver qué ‘ s cambiado y haga clic en el bit » editado » xx minutos » para ver un historial completo si quieres retroceder. Aunque es viable, su respuesta no ‘ agrega mucho más de lo que ‘ ya se ha escrito y es poco probable que atraiga mucha atención.
Respuesta
Este procedimiento generará un archivo CSV con la salida de la consulta que usted pasa como parámetro. El segundo parámetro es el nombre de su archivo CSV, asegúrese de pasar el nombre del archivo con una ruta de escritura válida.
Aquí está el script para crear el procedimiento:
CREATE procedure [dbo].[usp_create_csv_file_from_query] @sql Nvarchar(MAX), @csvfile Nvarchar(200) as BEGIN if IsNull(@sql,"") = "" or IsNull(@csvfile,"") = "" begin RAISERROR ("Invalid SQL/CsvFile values passed!; Aborting...", 0, 1) WITH NOWAIT return end DROP TABLE if exists global_temp_CSVtable; declare @columnList varchar(4000), @columnList1 varchar(4000), @sqlcmd varchar(4000), @dos_cmd nvarchar(4000) set @sqlcmd = replace(@sql, "from", "into global_temp_CSVtable from") EXECUTE (@sqlcmd); declare @cols table (i int identity, colname varchar(100)) insert into @cols select column_name from information_schema.COLUMNS where TABLE_NAME = "global_temp_CSVtable" declare @i int, @maxi int select @i = 1, @maxi = MAX(i) from @cols while(@i <= @maxi) begin select @sql = "alter table global_temp_CSVtable alter column [" + colname + "] VARCHAR(max) NULL" from @cols where i = @i exec sp_executesql @sql select @i = @i + 1 end SELECT @columnList = COALESCE(@columnList + """, """, "") + column_name ,@columnList1 = COALESCE(@columnList1 + ", ", "") + column_name from information_schema.columns where table_name = "global_temp_CSVtable" ORDER BY ORDINAL_POSITION; SELECT @columnList = """" + @columnList + """"; SELECT @dos_cmd="BCP "SELECT " + @columnList + " UNION ALL " + "SELECT * from " + db_name() + "..global_temp_CSVtable" " + "QUERYOUT " + @csvfile + " -c -t, -T" exec master.dbo.xp_cmdshell @dos_cmd, No_output DROP TABLE if exists global_temp_CSVtable; end
Comentarios
- Las respuestas de solo código no ‘ t se consideran aceptables aquí. ¿Podría agregar algún comentario sobre su respuesta y por qué funciona? (los comentarios de código probablemente también ayudarían aquí)
- Sí, ¿y también podría agregar un ejemplo de cómo lo usa con éxito?
Respuesta
Utilizo MS Access DoCMD para exportar archivos CSV desde SQL Server. Es capaz de hacerlo con un solo comando. La base de datos de acceso solo se usa para habilitar el comando de acceso. Funciona bien y como beneficio adicional (no estoy seguro de por qué) crea un schema.ini para la tabla exportada.
Adam
CMD="SELECT * INTO [Text;HDR=Yes;DATABASE=C:\].[Results.txt] FROM [ODBC;DSN=SQL2017;Description=SQL2017;UID=.;Trusted_Connection=Yes;APP=Microsoft Office 2013;WSID=LAPTOP-XYZ;DATABASE=TempDB_DataDump_1].Results " Set appAccess = CreateObject("Access.Application") appAccess.OpenCurrentDatabase "anyAccessdatabase.mdb" " appAccess.DoCmd.SetWarnings 0 appAccess.DoCmd.runsql "CMD"