È 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
Nessun commento:
Posta un commento