2012-01-31 51 views
35

Tengo un script que hace varias cosas y el resultado final es una tabla grande. Me preguntaba cómo podría exportar esta tabla final a un nuevo archivo de Excel (con encabezados de columna también).T-SQL: Exportar a un nuevo archivo de Excel

Tendría que hacer esto en el script.

Respuesta

59

Esto es, con mucho, el mejor destino para exportar a Excel desde SQL:

http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=49926

Para citar de usuario madhivanan,

Aparte de utilizar DTS y asistente de exportación, también podemos utilizar este consulta para exportar datos de SQL Server2000 a Excel

Cree un archivo de Excel denominado testing que tenga los encabezados iguales a los de las columnas de la tabla y use estas consultas

1 Exportar datos a archivo de Excel existente de tabla de SQL Server

insert into OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
    'Excel 8.0;Database=D:\testing.xls;', 
    'SELECT * FROM [SheetName$]') select * from SQLServerTable 

2 exportar datos desde Excel a tabla nueva de SQL Server

select * 
into SQLServerTable FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
    'Excel 8.0;Database=D:\testing.xls;HDR=YES', 
    'SELECT * FROM [Sheet1$]') 

3 Exportar datos desde Excel a tabla de SQL Server existente (editado)

Insert into SQLServerTable Select * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
    'Excel 8.0;Database=D:\testing.xls;HDR=YES', 
    'SELECT * FROM [SheetName$]') 

4 Si no desea crear un archivo EXCEL de antemano y desea exportar datos a él, utilice

EXEC sp_makewebtask 
    @outputfile = 'd:\testing.xls', 
    @query = 'Select * from Database_name..SQLServerTable', 
    @colheaders =1, 
    @FixedFont=0,@lastupdated=0,@resultstitle='Testing details' 

(Ahora se puede encontrar el archivo con los datos en formato tabular)

5 para exportar datos a un nuevo archivo EXCEL con la rúbrica (nombres de columna), cree el siguiente procedimiento

create procedure proc_generate_excel_with_columns 
(
    @db_name varchar(100), 
    @table_name varchar(100), 
    @file_name varchar(100) 
) 
as 

--Generate column names as a recordset 
declare @columns varchar(8000), @sql varchar(8000), @data_file varchar(100) 
select 
    @columns=coalesce(@columns+',','')+column_name+' as '+column_name 
from 
    information_schema.columns 
where 
    [email protected]_name 
select @columns=''''''+replace(replace(@columns,' as ',''''' as '),',',',''''') 

--Create a dummy file to have actual data 
select @data_file=substring(@file_name,1,len(@file_name)-charindex('\',reverse(@file_name)))+'\data_file.xls' 

--Generate column names in the passed EXCEL file 
set @sql='exec master..xp_cmdshell ''bcp " select * from (select '[email protected]+') as t" queryout "'[email protected]_name+'" -c''' 
exec(@sql) 

--Generate data in the dummy file 
set @sql='exec master..xp_cmdshell ''bcp "select * from '[email protected]_name+'..'[email protected]_name+'" queryout "'[email protected]_file+'" -c''' 
exec(@sql) 

--Copy dummy file to passed EXCEL file 
set @sql= 'exec master..xp_cmdshell ''type '[email protected]_file+' >> "'[email protected]_name+'"''' 
exec(@sql) 

--Delete dummy file 
set @sql= 'exec master..xp_cmdshell ''del '[email protected]_file+'''' 
exec(@sql) 

Después de crear el procedimiento, ejecutarlo proporcionando el nombre de base de datos, nombre de la tabla y la ruta del archivo:

EXEC proc_generate_excel_with_columns 'your dbname', 'your table name','your file path' 

Tiene 29 páginas, pero eso se debe a que otros muestran otras maneras y también a personas que hacen preguntas como esta sobre cómo hacerlo.

Sigue ese hilo por completo y mira las diferentes preguntas que las personas han hecho y cómo se resuelven. Recogí un poco de conocimiento simplemente rozando y he usado porciones de él para obtener los resultados esperados.

Para actualizar células individuales

Un miembro también existe publica Peter Larson lo siguiente: Creo que una cosa es que falta aquí. Es genial poder exportar e importar archivos a Excel, pero ¿qué hay de actualizar las celdas individuales? O un rango de celdas?

Este es el principio de cómo se las arreglan que

update OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
'Excel 8.0;Database=c:\test.xls;hdr=no', 
'SELECT * FROM [Sheet1$b7:b7]') set f1 = -99 

También puede agregar fórmulas de Excel usando esto:

update OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
'Excel 8.0;Database=c:\test.xls;hdr=no', 
'SELECT * FROM [Sheet1$b7:b7]') set f1 = '=a7+c7' 

Exportación con nombres de columna utilizando T-SQL

El miembro Mladen Prajdic también tiene una entrada en el blog sobre cómo hacer esto here

Referencias: www.sqlteam.com (por cierto este es un excelente blog/foro para cualquiera que busque obtener más de SQL Server). Para referencias de error Solía ​​this

errores que pueden ocurrir

Si se obtiene el siguiente error:

OLE DB provider 'Microsoft.Jet.OLEDB.4.0' cannot be used for distributed queries

A continuación, ejecute la siguiente:

sp_configure 'show advanced options', 1; 
GO 
RECONFIGURE; 
GO 
sp_configure 'Ad Hoc Distributed Queries', 1; 
GO 
RECONFIGURE; 
GO 
+8

Salvo que el controlador Jet aparentemente no funciona en sistemas de 64 bits, por lo que está de vuelta al punto de partida. – mickeyf

+0

Msg 7308, nivel 16, estado 1, línea 1 El proveedor OLE DB 'Microsoft.Jet.OLEDB.4.0' no se puede usar para consultas distribuidas porque el proveedor está configurado para ejecutarse en modo de apartamento de subproceso único. 'TENGO ESTE ERROR' –

+2

Quería mencionar que ahora hay un controlador de 64 bits llamado" Microsoft Access Database Engine 2010 Redistributable ", disponible de Microsoft aquí: https://www.microsoft.com/en-us /download/details.aspx?id=13255 – Kanmuri

1

Me gustaría añadir una comentario adicional a lo que hizo JonH en el paso 5:

@columns=coalesce(@columns+',','')+column_name+' as '+'[' + column_name + ']' 

añadiendo los soportes permite incluir columnas con espacios en la salida.

2

Uso PowerShell:

$Server = "TestServer" 
$Database = "TestDatabase" 
$Query = "select * from TestTable" 
$FilePath = "C:\OutputFile.csv" 

# This will overwrite the file if it already exists. 
Invoke-Sqlcmd -Query $Query -Database $Database -ServerInstance $Server | Export-Csv $FilePath 
+0

No tengo idea de por qué no se sube la apuesta. Este es el ganador por un deslizamiento de tierra para mí. La única advertencia que puedo pensar es la falta de soporte simple para múltiples hojas de trabajo, que es común para las consultas de informes. Aparte de eso, esta es absolutamente la opción de resistencia más baja. – pimbrouwers

Cuestiones relacionadas