[英]Export SQL data to Excel - Best possible approach?
我目前正在研究需要將 sql 結果導出到 excel 數據的自動化。 我想通過 SQL 查詢來做到這一點。 我知道的選項很少如下,但在我開始探索這些東西之前。 我想知道最好的方法。
PS - 如果有一種方法可以在查詢執行期間動態創建 excel 並將數據導出到多個 excel 表中,那就太好了。
您可以在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.