Как экспортировать результаты хранимой процедуры непосредственно в файл MS Excel? - PullRequest
0 голосов
/ 26 июня 2009

Я нашел способ извлекать содержимое таблицы MS Sql напрямую (быстрее), чтобы преуспеть. Но я не знаю, как это сделать с помощью хранимой процедуры, которая требует параметров. Можно ли напрямую извлечь в файл Excel результаты хранимой процедуры? Я знаю, как сделать это косвенно (используя таблицу данных), но это слишком медленно. Большое спасибо.

PS: это метод, который я использовал, чтобы провести несколько тестов. Он работает с таблицей, но мне нужно извлечь результат хранимой процедуры:

    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

Ответы [ 2 ]

1 голос
/ 03 июля 2009

У меня нет Excel для проверки, но вы можете попробовать:

  1. Начать запись нового макроса
  2. на новом листе выберите меню «Данные» -> «Импорт» и что-то вроде «источника данных»
  3. выберите вашу таблицу / представление (я не уверен, что хранимая процедура также поддерживается)
  4. настроить все учетные данные и т. Д.
  5. выполните остальные шаги ...
  6. остановить запись макроса

и посмотрите на сгенерированный код VBA.

Если вы всегда выполняете один и тот же запрос (или несколько разных), то все, что вам нужно, - это создать несколько таких источников данных с автообновлением при запуске .

0 голосов
/ 03 июля 2009

Является ли Python вариантом для вас?

Придуманная хранимая процедура, которая принимает параметр и возвращает набор результатов:

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

В Python вы можете сделать что-то вроде этого:

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 должен без проблем открыть этот CSV-файл.

...