我的要求是将自动电子邮件创建为(通过数据库邮件格式化的 HTML 电子邮件)基本要求已经完成,当触发作业时,它将数据插入表中,并且该信息已计划作为电子邮件发送,但现在客户已经要求以这种格式。
我所做的当前格式
PO Date:2014-11-26 PO ID:PO1 SAP Ref:0001106102 GRN:1067 DealerID:045 Dealer Name:ABC(Pvt)Ltd. 2 Status:New
客户要求的格式,类似格式的表格
PO Date |PO ID| SAP Ref| GRN|DealerID|Dealer Name|Status
这是我用来将数据插入到 Email_Table(_ERROR_MAIL) 的 SQL 查询,这需要根据要求进行垂涎
IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = 'ImpCancelledGRN')
BEGIN
DROP PROCEDURE [dbo].[ImpCancelledGRN]
END
GO
CREATE PROCEDURE [dbo].[ImpCancelledGRN]
WITH ENCRYPTION
AS
SET NOCOUNT ON
BEGIN
BEGIN TRY
-- Begin transaction
BEGIN TRAN
INSERT INTO _ERROR_MAIL(Recipients, Subject, CreationDate, IsNew, LastModifiedBy, Body)
SELECT '[email protected]', 'SAP CANCELLED GRN', GETDATE(), 1, 'sapws',
'PO Date:' + CONVERT(VARCHAR(10),P.Date,120) +
' PO ID:' + P.ID +
' SAP Ref:' + P.ID2 +
' GRN:' + G.ID +
' Dealer ID:' + D.ID +
' Dealer Name:' + D.Name +
' Status:' + CASE WHEN G.SubmittedDate IS NULL THEN 'New' ELSE 'Dealer Submitted' END
FROM I_CancelledGRN I
INNER JOIN TxnGRN G ON G.ID = I.ID
INNER JOIN Distributor D ON D.UID = G.DistributorUID
INNER JOIN POTxn P ON P.SiteUID = G.POTxn_SiteUID AND P.UID = G.POTxnUID
WHERE IsCancelled IS NULL;
UPDATE TxnGRN
SET ExpiryDate = GETDATE()
, SAPCancellationDate = I.Date
, SAPCancelledBy = 'SAP'
, IsCancelled = 1
FROM I_CancelledGRN I
INNER JOIN TxnGRN G ON G.ID = I.ID
WHERE IsCancelled IS NULL;
-- Commit transaction
COMMIT TRAN
END TRY
BEGIN CATCH
-- Get error message, severity and satus information
DECLARE @ErrorMessage NVARCHAR(4000), @ErrorSeverity INT, @ErrorState INT;
SELECT @ErrorMessage = ERROR_MESSAGE(), @ErrorSeverity = ERROR_SEVERITY(), @ErrorState = ERROR_STATE();
-- Rollback transaction
ROLLBACK TRAN;
-- Log error message details
INSERT INTO _ERROR_LOG(Module, SubModule, Text, Date)
VALUES('SAP', '[ImpCancelledGRN]', @ErrorMessage, GETDATE());
-- Raise error
RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);
END CATCH
RETURN 0;
END
SET NOCOUNT OFF
GO
在这里,您如何创建邮件的 HTML 正文部分。
步骤1:
第 2 步: 创建数据库电子邮件配置文件
第 3 步:发送电子邮件
我的用户正在寻找“XML PATH”解决方案并尝试使用它,但他们不是程序员,因此感到困惑。我没有尝试帮助他们学习使用 XML PATH,而是创建了一个过程,该过程采用表的名称并返回包含 HTML 标记的字符串,以将表显示为 HTML 表。我的解决方案从数据源动态地派生 HTML 表的列名。
程序 HtmlTable 的示例使用
@tableHtml 变量仅包含 HTML 表格的标记,适合包含在电子邮件正文中。要单独查看,您需要使用 html、head 和 body 标签包装输出。
过程 HtmlTable 的输出
程序 HtmlTable 的代码
请注意,我正在调用过程“DataSourceCheck”来确定参数@data_source 包含有效表的名称。DataSourceCheck 不必是一个单独的过程——SQL 可以直接包含在 HtmlTable 过程中,但为了模块化和可重用性,我将它分开。
过程 DataSourceCheck 的示例使用
输出
现在放下桌子,看看会发生什么:
输出
过程 DataSourceCheck 的代码
我还有一个 HtmlTable 版本,可以从表(而不是 HTML 表)创建 CSV 文件。