自動化 SQL Server 報告並通過郵件發送
我在一家擁有良好 SQL Server 環境的大型零售企業工作。我們有 SQL Server 複製、可用性組、數據倉庫和一些雲服務。在這個優美的環境中,我們使用功能有限的桌面應用程序。業務總是需要一些額外的報告,應用程序支持團隊在大多數情況下都會延遲傳遞它們。
作為一名高級數據庫管理員,他們回到我身邊,嘗試將數據從 SQL Server 提取到 Excel 文件。隨著我們變得越來越大,這幾乎成了一項日常任務,我設法開發了一個 C# 工具,可以通過郵件將大部分報告發送給每個需要它們的人,但現在它已經過時了,老實說需要很多時間來重寫。
是否有可以執行 SQL 查詢並將結果添加到 Excel 文件並將其郵寄到特定電子郵件列表的工具?
我能夠使用 PowerShell 完成此任務,我設法使用儲存的 proc 創建我的數據,然後從 Invoke-Sqlcmd 呼叫它
$todayDate = Get-Date -Format "yyyy-MM-dd"; $fileName = $todayDate + "_OrdersReport.csv"; $AttachmentPath = "c:\temp\" + $fileName; $QueryFmt = "exec [excel].[SelectHdOrdersTimeReport]"; # Write-Output $AttachmentPath; Invoke-Sqlcmd -ServerInstance databaseServerName -Database dbName -Query $QueryFmt -Username username -Password password| Export-CSV $AttachmentPath;
然後我只是使用 Send-MailMessage 電源外殼模組發送了這個文件
Send-MailMessage -From "dbreport@myCompany.com" -To "ahmed.magdi@myCompany.com" -Attachments $AttachmentPath -Subject $fileName -Body "HYG" -SmtpServer "mail.myCompany.com";
它就像一個魅力:D
我創建了一個儲存過程,它從任何表中獲取數據並將其插入到CSV或Excel 中,然後將其發送到電子郵件或上傳到 SharePoint,它適用於 SQL Server 2019,您可以從此處下載ExportToExcel。
這是有關如何使用它的範例:
SELECT columna, columnb, "column c" INTO ##anytemptable --must be a global temp table FROM yourdb.dbo.yourtable WHERE somecolumn = 'somecondition' exec dbo.ExportToExcel @tablename= '##anytemptable' --must be a global temp table ,@filepath = 'c:\somefolder\' ,@filename = 'MyDataInExcel.xlsx' ,@AttachToMail = 1, ,@MailList = 'yourboss@domain.com'
這個文件的美妙之處在於該文件已經格式化並且易於閱讀:
使用 CSV 導出數據當然有一種簡單的方法,但對於某些報告,文件會變得非常大,無法附加到郵件中,因此此處使用 Excel 是明智的選擇。
您無需指定
@filepath
or@filename
,程式碼將自動創建它們並在執行結束時顯示文件完整路徑。您還可以使用參數
@MailSubject
並@MailBody
指定電子郵件的正文和主題,該過程的唯一限制是不在目標伺服器上啟用 PSGallery,如果存在,程式碼會自動處理安裝模組。如果你不喜歡花哨的格式和漂亮的 Excel 文件,你可以這樣做:
exec msdb.dbo.sp_send_dbmail @recipients = 'email@domain.com', @subject = N'CSV Report', @body = N'PFA', @query='SET NOCOUNT ON SELECT * FROM db.dbo.table', @query_attachment_filename = 'YourReport.csv', @attach_query_result_as_file = 1, @query_result_header = 1, @query_result_width = 32767, @append_query_error = 0, @query_result_no_padding = 1, @query_result_separator = ' '; --specify your column delimiter here