2009-06-26 12 views
0

J'ai trouvé un moyen d'extraire le contenu d'une table MS SQL directement (plus rapide) pour exceller. Mais je ne sais pas comment le faire avec une procédure stockée qui nécessite des paramètres. Est-il possible d'extraire directement dans un fichier Excel les résultats d'une procédure stockée? Je sais comment le faire indirectement (en utilisant une table de données) mais c'est trop lent. Merci beaucoup. PS: C'est la méthode que j'utilisais pour faire quelques tests. Cela fonctionne avec une table, mais ce dont j'ai besoin est d'extraire le résultat d'une procédure stockée:Comment exporter les résultats d'une procédure stockée directement dans un fichier MS Excel?

Private Sub SqlToExcelTest2(ByVal excelFilePath As String, _ 
          ByVal nonExistingSheetName As String, _ 
          ByVal sqlServer As String, _ 
          ByVal sqlDatabase As String, _ 
          ByVal sqlUserName As String, _ 
          ByVal sqlPassword As String, _ 
          ByVal sqlTable As String) 

    Const excelConnStrTemplate As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=""Excel 8.0;HDR=YES;IMEX=2"";" 

    Dim connStr As String = String.Format(excelConnStrTemplate, _ 
              excelFilePath) 

    Const adoQueryTemplate As String = "SELECT * INTO {0} FROM [odbc;Driver={{SQL Server}};" & _ 
    "Server={1};Database={2};UID={3};PWD={4}].[{5}] " 

    Dim query As String = String.Format(adoQueryTemplate, _ 
    nonExistingSheetName, _ 
    sqlServer, _ 
    sqlDatabase, _ 
    sqlUserName, _ 
    sqlPassword, _ 
    sqlTable) 

    Using oleConn As New OleDb.OleDbConnection(connStr), oleCmd As New OleDb.OleDbCommand(query, oleConn) 
     oleConn.Open() 
     oleCmd.ExecuteNonQuery() 
     oleConn.Close() 
    End Using 

End Sub 
+0

Si vous ne faites cela occasionnellement pour les tests, pouvez-vous utiliser la fonctionnalité Management Studio pour exporter vers Excel? Définissez la sortie de la requête sur Excel, puis exécutez le sproc dans une fenêtre de requête. – DOK

Répondre

0

Python est-il une option pour vous?

Une procédure artificielle stockée qui prend un paramètre et retourne un jeu de résultats:

create procedure usp_Temp @howmany tinyint 
as 
set nocount on 

create table #tmp (ID int identity, Letter char(1), String varchar(50)) 

declare @i tinyint 
set @i = 0 

while @i < @howmany 
begin 
    insert into #tmp (Letter, String) values('X', 'The quick brown fox...') 
    set @i = @i + 1 
end 

select * from #tmp 
set nocount off 

En Python, vous pourriez faire quelque chose comme ceci:

import dbi 
import odbc 
import csv 

conn_str = 'Driver={SQL Server};Server=MyServer;Database=MyDb;Uid=MyLogin;Pwd=MyPwd' 
conn = odbc.odbc(conn_str) 
curs = conn.cursor() 

curs.execute('exec usp_temp @howmany = 15') 
results = curs.fetchall() 

curs.close() 
conn.close() 

writer = csv.writer(open('tmp.csv', 'wb'), delimiter = ',', 
    quoting = csv.QUOTE_MINIMAL) 

for result in results: writer.writerow(result) 

Excel devrait être en mesure d'ouvrir cette Fichier CSV sans problème.

1

Je n'ai pas Excel en ce moment pour vérifier, mais vous pouvez essayer:

  1. Démarrer l'enregistrement d'une nouvelle macro
  2. sur un nouveau menu de sélection de feuille de calcul Data-> Importer, et quelque chose comme « source de données "
  3. choisissez votre table/vue (je ne sais pas si la procédure stockée est également pris en charge)
  4. configuration toutes les informations d'identification, etc.
  5. suivre le reste des étapes ...
  6. arrêtez la macro d'enregistrement

et jetez un oeil au code VBA généré.

Si vous exécutez toujours la même requête (ou peu différents), puis créer quelques-uns de ces sources de données avec l'auto-refresh au démarrage pourrait être tout ce que vous avez besoin.

Questions connexes