簡體   English   中英

將 SQL 數據導出到 Excel - 最佳方法?

[英]Export SQL data to Excel - Best possible approach?

我目前正在研究需要將 sql 結果導出到 excel 數據的自動化。 我想通過 SQL 查詢來做到這一點。 我知道的選項很少如下,但在我開始探索這些東西之前。 我想知道最好的方法。

PS - 如果有一種方法可以在查詢執行期間動態創建 excel 並將數據導出到多個 excel 表中,那就太好了。

  1. 開路集
  2. bcp_cmd

您可以在Excel 2016通過PowerQuery CREATE VIEW並在其數據連接下使用該視圖。 視圖是首選,因為它們在服務器中獨立管理,並提供實時數據結果,而無需在 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

不久前,我將這個 Powershell 腳本拼湊在一起。
它查詢sql server數據,保存為csv,格式化並保存為xls,然后通過smtp發送郵件。
您可以設置 Windows 計划任務以使其自動化。

還有一個用於 powershell 的import xls 模塊

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()

根據您安裝的內容,下載並安裝 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/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM