web-dev-qa-db-fra.com

T-SQL: Exporter vers un nouveau fichier Excel

J'ai un script qui fait diverses choses et le résultat final est une grande table. Je me demandais comment exporter cette table finale dans un nouveau fichier Excel (avec en-tête de colonne également).

J'aurais besoin de faire cela dans le script.

42
Ryan

C'est de loin le meilleur post pour exporter du code SQL vers Excel:

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

Pour citer l'utilisateur madhivanan,

Outre l'utilisation de DTS et de l'assistant d'exportation, nous pouvons également utiliser cette requête pour exporter des données de SQL Server2000 vers Excel

Créez un fichier Excel nommé testing avec les en-têtes identiques à ceux des colonnes de table et utilisez ces requêtes.

1 Exporter des données vers un fichier Excel existant à partir d'une table SQL Server

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

2 Exporter des données d'Excel vers une nouvelle table 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 Exporter des données d'Excel vers une table SQL Server existante (modifiée)

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 vous ne voulez pas créer un fichier Excel à l’avance et que vous souhaitez y exporter des données, utilisez

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

(Vous pouvez maintenant trouver le fichier avec les données sous forme de tableau)

5 Pour exporter des données dans un nouveau fichier Excel avec en-tête (noms de colonnes), créez la procédure suivante.

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 
    table_name=@table_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 '+@columns+') as t" queryout "'+@file_name+'" -c'''
exec(@sql)

--Generate data in the dummy file
set @sql='exec master..xp_cmdshell ''bcp "select * from '+@db_name+'..'+@table_name+'" queryout "'+@data_file+'" -c'''
exec(@sql)

--Copy dummy file to passed Excel file
set @sql= 'exec master..xp_cmdshell ''type '+@data_file+' >> "'+@file_name+'"'''
exec(@sql)

--Delete dummy file 
set @sql= 'exec master..xp_cmdshell ''del '+@data_file+''''
exec(@sql)

Après avoir créé la procédure, exécutez-la en fournissant le nom de la base de données, le nom de la table et le chemin du fichier:

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

C’est 29 pages volumineuses, mais c’est parce que d’autres montrent diverses manières, ainsi que des personnes qui posent des questions comme celle-ci sur la façon de le faire.

Suivez ce fil entièrement et examinez les différentes questions que les gens ont posées et comment elles sont résolues. J'ai acquis pas mal de connaissances et je les ai utilisées en partie pour obtenir les résultats escomptés.

Pour mettre à jour des cellules individuelles

Un membre également présent Peter Larson a écrit ce qui suit: Je pense qu’il manque une chose ici. Il est bon de pouvoir exporter et importer des fichiers Excel, mais qu’en est-il de la mise à jour de cellules uniques? Ou une gamme de cellules?

C’est le principe de votre gestion

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

Vous pouvez également ajouter des formules à Excel en utilisant ceci:

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'

Exporter avec des noms de colonnes à l'aide de T-SQL

Le membre Mladen Prajdic a également une entrée de blog expliquant comment faire ceci ici

Références: www.sqlteam.com (En fait, il s'agit d'un excellent blog/forum pour ceux qui cherchent à tirer le meilleur parti de SQL Server). Pour les erreurs de référencement j'ai utilisé this

Erreurs pouvant survenir

Si vous obtenez l'erreur suivante:

Le fournisseur OLE DB 'Microsoft.Jet.OLEDB.4.0' ne peut pas être utilisé pour des requêtes distribuées

Puis lancez ceci:

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ad Hoc Distributed Queries', 1;
GO
RECONFIGURE;
GO
65
JonH

Utilisez 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
9
neizan