【问题标题】:Export SQL data to Excel - Best possible approach?将 SQL 数据导出到 Excel - 最好的方法?
【发布时间】:2020-02-21 17:38:59
【问题描述】:

我目前正在研究需要将 sql 结果导出到 excel 数据的自动化。我想通过 SQL 查询来做到这一点。我知道的几个选项如下,但在我开始探索这些东西之前。我想知道最好的方法。

PS - 如果有一种方法可以在查询执行期间动态创建 Excel 并将数据导出到多个 Excel 工作表中,那就太好了。

  1. 开放式设置
  2. bcp_cmd

【问题讨论】:

  • 3. SQL Server 集成服务 (SSIS)
  • 因为您引用了 BCP,所以您的 SQL 查询可能已保存或可能保存在文本文件中。如果是这种情况,另一种选择是 execsql.py (pypi.org/project/execsql),它将数据导出到 Excel 将打开的 ODF 工作簿。免责声明:我写了 execsql。
  • 这能回答你的问题吗? T-SQL: Export to new Excel file

标签: sql sql-server excel export bcp


【解决方案1】:

您可以CREATE VIEW 并通过PowerQuery 在其数据连接下使用Excel 2016 中的该视图。视图是首选,因为它们在服务器中独立管理,并提供实时数据结果,无需将完整查询嵌入 Excel 文件。结果集作为可刷新表存在于工作簿中。需要记录的结果应通过新的工作簿或UPDATE 以单独的脚本返回服务器。

在 PowerQuery 编辑器的“主页”选项卡中,单击 Advanced Editor。数据库连接字符串和对服务器的调用如下。您还可以使用Name Manager 中的表将参数从 Excel 表动态传递到查询。

Excel tab, table name: tbl_Parameters

    A         B
1 StartDate  01/01/2020
2 EndDate    02/01/2020
let
   Source = Sql.Database("ServerName" , "Database", [Query="

DECLARE @Start_Date AS datetime
DECLARE @End_Date AS datetime

SET @Start_Date = '"&StartDate&"'
SET @End_Date = '"&EndDate&"'


SELECT * FROM uvw_product
WHERE item_sold_date BETWEEN
@Start_Date AND @End_Date

"])
in
   Source

【讨论】:

    【解决方案2】:

    不久前,我将这个 Powershell 脚本拼凑在一起。
    它查询 sql server 数据,保存为 csv,格式化并保存为 xls,然后通过 smtp 发送邮件。
    您可以设置一个 windows 计划任务来自动执行它。

    还有一个 import xls module 用于 powershell。

    Import-Module Sqlps -DisableNameChecking;
    
    #execute mysql query as excel
    $Server = "DB SERVER";
    $Database = "DBNAME";
    
    $Query = @"
    *SELECT QUERY HERE*
    "@
    $a = Get-Date
    #note: if you run get-location from ide, it will use the ide path instead of the script path 
    $currentLocation = Split-Path -Parent $PSCommandPath
    $FilePath = $currentLocation + "\CSVName.csv"
    $SavePath = $currentLocation + "\XLSFileName" +$a.Day+ $a.Month + $a.Year + ".xls"
    $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
    $SqlConnection.ConnectionString = "Server = $Server; Database = $Database; User ID = DBUSERNAME; Password = PASSWORD";
    $SqlConnection.Open()
    $sqlcmd = $SqlConnection.CreateCommand()
    $sqlcmd.Connection = $SqlConnection
    $sqlcmd.CommandText = $Query
    
    
    $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
    $SqlAdapter.SelectCommand = $sqlcmd
    $DataSet = New-Object System.Data.DataSet
    $SqlAdapter.Fill($DataSet)
    $DataSet.Tables[0] | Export-Csv -notypeinformation $FilePath
    
    
    $SqlConnection.Close()
    #Invoke-Sqlcmd -Query $Query -ConnectionString $SqlConnection.ConnectionString | Export-Csv -notypeinformation $FilePath
    
    #release memory function
    function Release-Ref($ref){
        ([System.Runtime.InteropServices.Marshal]::ReleaseComObject([System.__ComObject]$ref) -gt 0)
        [System.GC]::Collect()
        [System.GC]::WaitForPendingFinalizers()
    }
    
    #format excel to display correct date
    $objExcel = new-object -comobject excel.application  
    $objWorkbook = $objExcel.Workbooks.open($FilePath)
    $objWorksheet = $objWorkbook.Worksheets.Item(1) 
    $objRange = $objWorksheet.UsedRange
    [void] $objRange.EntireColumn.Autofit()
    $objWorkbook.Saved = $True
    $objExcel.DisplayAlerts = $False
    $objWorkbook.SaveAs($SavePath,1)
    $objExcel.Quit()
    
    #release memory
    Release-Ref($objWorksheet) 
    Release-Ref($objWorkbook) 
    Release-Ref($objExcel)
    
    #create mail
    $smtpServer = "SMTPSERVER"
    $smtp = new-object Net.Mail.SmtpClient($smtpServer)
    
    $att = new-object Net.Mail.Attachment($SavePath)
    $msg = new-object Net.Mail.MailMessage
    $msg.Subject = "EMAIL SUBJECT"
    $msg.From = "FROM EMAIL"
    #$msg.To.Add("TO EMAIL 1")
    $msg.To.Add("TO EMAIL 2")
    $msg.Body = @"
    Hi,
    
    MSG BODY HERE
    
    Best Regards
    "@
    $msg.Attachments.Add($att)
    
    $smtp.Send($msg)
    $att.Dispose()
    
    

    【讨论】:

      【解决方案3】:

      根据您安装的内容,下载并安装 64 位或 32 位版本的驱动程序。

      https://www.microsoft.com/en-us/download/details.aspx?id=13255

      那么,你应该可以运行这个了。

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

      注意:如果您使用一种 32 位技术和一种 64 位技术,这可能不起作用。在这种情况下,您可能需要采用某种解决方法。

      有关如何集成 SQL Server 和 Excel 的其他想法,请参阅此链接。

      https://solutioncenter.apexsql.com/how-to-import-and-export-sql-server-data-to-an-excel-file/

      【讨论】:

        猜你喜欢
        • 2016-01-15
        • 1970-01-01
        • 1970-01-01
        • 2010-10-01
        • 2012-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多