giovedì 26 gennaio 2012

Export da SQL Server a Excel

È possibile esportare una tabella db o l'output di una query SQL in excel, magari utilizzando una stored procedure o, comunque, direttamente tramite un comando SQL? La risposta è: SI!

Innanzitutto dobbiamo creare una Stored Procedure che si occupi di fare "il lavoro sporco". Questa SP legge le colonne ed i dati della tabella e crea un file excel con tutti i dati in essa contenuti suddivisi proprio in colonne.


CREATE PROCEDURE proc_generate_excel_with_columns
(
@db_name varchar (100),
@table_name varchar (100),
@file_name varchar (100)
)
AS

--Genera il nome delle colonne
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 
table_name=@table_name
SELECT @columns=''''''+replace( replace (@columns,' as ',''''' as '),',',',''''')

--Crea un file temporaneo per i dati
SELECT @data_file=substring(@file_name,1,len(@file_name)-charindex('\',reverse(@file_name)))+'\data_file.xls'

--Crea le colonne nel file Excel
SET @sql='exec master..xp_cmdshell ''bcp " select * from (select '+@columns+') as t" queryout "'+@file_name+'" -c -T'''
EXEC(@sql)

--Genera i dati nel file temporanep
SET @sql='exec master..xp_cmdshell ''bcp "select * from '+@db_name+'..'+@table_name+'" queryout "'+@data_file+'" -c -T'''
EXEC(@sql)

--Copia il file temporaneo nel file Excel
SET @sql= 'exec master..xp_cmdshell ''type '+@data_file+' >> "'+@file_name+'"'''
EXEC(@sql)

--Cancella il file temporaneo
SET @sql= 'exec master..xp_cmdshell ''del '+@data_file+''''
EXEC(@sql)


Poi bisogna invocare la SP indicando il nome del Database di riferimento, il nome della tabella* ed il percorso del file excel che conterrà i risultati.

EXEC proc_generate_excel_with_columns 'NOME_DB', 'NOME_TABELLA','NOME_FILE'

ATTENZIONE:
Su molti sistemi, per impostazione di default, alcuni comandi utilizzati nella SP sono disattivati. Per attivarli si può utilizzare il seguente comando al posto del precedente:


EXEC master.dbo.sp_configure 'show advanced options', 1


RECONFIGURE


EXEC master.dbo.sp_configure 'xp_cmdshell', 1


RECONFIGURE

EXEC proc_generate_excel_with_columns 'NOME_DB''NOME_TABELLA','NOME_FILE'

EXEC master.dbo.sp_configure 'xp_cmdshell', 0


RECONFIGURE

*TIP: Al posto di "Nome_Tabella" è anche possibile inserire il nome di una Vista (View) precedentemente creata oppure di una tabella temporanea