Sql-Server

自動化 SQL Server 報告並通過郵件發送

  • June 29, 2022

我在一家擁有良好 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

我創建了一個儲存過程,它從任何表中獲取數據並將其插入到CSVExcel 中,然後將其發送到電子郵件或上傳到 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'

這個文件的美妙之處在於該文件已經格式化並且易於閱讀:

Excel 報告

使用 CSV 導出數據當然有一種簡單的方法,但對於某些報告,文件會變得非常大,無法附加到郵件中,因此此處使用 Excel 是明智的選擇。

您無需指定@filepathor @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

引用自:https://dba.stackexchange.com/questions/313786