2012-01-31 6 views
35

J'ai un script qui fait plusieurs choses et le résultat final est une grande table. Je me demandais comment exporter cette table finale vers un nouveau fichier Excel (avec les en-têtes de colonnes).T-SQL: Exporter vers un nouveau fichier Excel

Je devrais le faire dans le script.

Répondre

59

Ceci est de loin le meilleur poste pour l'exportation vers Excel de SQL:

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

Pour citer l'utilisateur madhivanan,

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

Créer un fichier Excel nommé testing ayant les en-têtes identiques à ceux des colonnes de table et utiliser ces requêtes

1 Exporter des données vers le fichier EXCEL existant de la 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 à partir d'Excel à la 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 à partir d'Excel à table existante SQL Server (édité)

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 voulez y exporter des données, utiliser

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

(Vous pouvez trouver le fichier avec les données en format tableau)

5 Pour exporter des données vers un nouveau fichier EXCEL avec rubrique (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 
    [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) 

Après avoir créé la procédure, l'exécuter en fournissant le nom de la base de données, 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 un 29 pages fouettant, mais c'est parce que d'autres montrent d'autres façons, ainsi que des gens qui posent des questions comme celle-ci sur la façon de le faire.

Suivez ce fil entièrement et regardez les différentes questions que les gens ont posées et comment ils sont résolus. J'ai pris connaissance d'un peu de connaissances en l'ignorant et j'en ai utilisé des portions pour obtenir les résultats escomptés.

Pour mettre à jour des cellules individuelles

Membre également Peter Larson il publie les éléments suivants: Je pense qu'une chose manque ici. C'est génial de pouvoir exporter et importer des fichiers Excel, mais qu'en est-il de la mise à jour des cellules individuelles? Ou une gamme de cellules?

Tel est le principe de la façon dont vous parvenez 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 

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' 

Exportation avec les noms de colonnes à l'aide de T-SQL

Le membre Mladen Prajdic a également un billet sur la façon de le faire here

Références: www.sqlteam.com (BTW c'est un excellent blog/forum pour ceux qui cherchent à tirer le meilleur parti de SQL Server). Pour le référencement d'erreur je this

erreurs qui peuvent se produire

Si vous obtenez l'erreur suivante:

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

Lancez ensuite ceci:

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

Sauf que le pilote de Jet ne semble fonctionne pas sur les systèmes 64 bits, de sorte que vous êtes de retour à la case départ. – mickeyf

+0

Msg 7308, niveau 16, état 1, ligne 1 Le fournisseur OLE DB 'Microsoft.Jet.OLEDB.4.0' ne peut pas être utilisé pour les requêtes distribuées car le fournisseur est configuré pour s'exécuter en mode appartement à un seul thread. "J'ai cette erreur" –

+2

Je voulais mentionner qu'il existe maintenant un pilote 64 bits appelé "Microsoft Access Database Engine 2010 redistribuable", disponible auprès de Microsoft ici: https://www.microsoft.com/fr-fr /download/details.aspx?id=13255 – Kanmuri

1

Je voudrais ajouter un commentaire supplémentaire à ce que JonH a fait à l'étape 5:

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

L'ajout des crochets permet d'inclure des colonnes avec des espaces dans la sortie.

2

Utiliser 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

Aucune idée pourquoi ce n'est pas mis à jour. C'est le gagnant par un glissement de terrain pour moi. La seule mise en garde que je peux penser, est le manque de support simple pour plusieurs feuilles de calcul qui est commun pour les requêtes de rapport. Autre que cela, c'est absolument l'option de résistance la plus faible. – pimbrouwers