Sql-Server

自動生成 sql 報告並通過郵件發送

  • June 26, 2022

您好,我在大型零售企業工作,擁有不錯的 sql server 環境。

sql複製、可用性組、數據磨損屋,以及一些雲服務。

我們在這個美麗的環境中使用有限功能的桌面應用程序

業務總是需要一些額外的報告,大多數時候應用程序支持團隊會延遲傳遞。

作為一名高級 dbAdmin,他們回到我身邊,嘗試將數據從 sql 提取到 excel 工作表文件。

隨著我們變得越來越大,它幾乎成了日常任務,我設法開發了 ac# 工具,通過郵件將大部分報告發送給每個需要它的人

但是現在它已經過時了,說實話重寫需要很多時間

是否有可以執行 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