Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何将存储过程的结果直接导出到MS Excel文件?_Sql_Excel_Ado - Fatal编程技术网

Sql 如何将存储过程的结果直接导出到MS Excel文件?

Sql 如何将存储过程的结果直接导出到MS Excel文件?,sql,excel,ado,Sql,Excel,Ado,我找到了一种将MS Sql表的内容直接(更快)提取到excel的方法。但我不知道如何对需要参数的存储过程执行此操作。是否可以将存储过程的结果直接提取到Excel文件中?我知道如何间接地(使用数据表)完成,但速度太慢了。多谢各位 PS:这是我用来做一些测试的方法。它与表一起工作,但我需要的是提取存储过程的结果: Private Sub SqlToExcelTest2(ByVal excelFilePath As String, _ B

我找到了一种将MS Sql表的内容直接(更快)提取到excel的方法。但我不知道如何对需要参数的存储过程执行此操作。是否可以将存储过程的结果直接提取到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

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

Excel应该能够毫无问题地打开该CSV文件。

我现在没有Excel可供检查,但您可以尝试:

  • 开始录制新宏
  • 在新工作表上,选择菜单数据->导入,以及类似“数据源”的内容
  • 选择您的表/视图(我不确定是否也支持存储过程)
  • 设置所有凭据等
  • 按照以下步骤操作
  • 停止录制宏
  • 并查看生成的VBA代码


    如果您总是运行同一个查询(或几个不同的查询),那么您只需要使用启动时自动刷新功能创建几个这样的数据源。

    如果您只是偶尔在测试时这样做,是否可以使用Management Studio功能导出到Excel?将查询输出设置为转到Excel,然后在查询窗口中运行存储过程。
    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)