提问人:PrettyCode 提问时间:11/3/2023 最后编辑:Dale KPrettyCode 更新时间:11/3/2023 访问量:68
获取添加到审核表的最新记录并发送电子邮件
Get the latest record added to an audit table and send email
问:
我正在尝试获取添加到审核表的最新记录,并向组织中的一些人发送一封电子邮件,其中包含添加的记录的详细信息,但不确定如何执行此操作。
我正在使用 Sharepoint SSRS 报表通过以下查询显示数据 -
-- for records which have updated BUSTYPE
SELECT UPPER(caa.Comments) + ' Record' 'SQLAction'
, c.BUS_TYPE AS CurrentBusType
, caa.BUS_TYPE AS PrevBusType
, caa.LastModified
, c.CUSTOMERID
, c.NAME
, c.ADDRESS1
, c.ADDRESS2
, c.CITY
, c.STATE
, c.ZIP,
FROM CUSTOMER_Audit AS caa
INNER JOIN CUSTOMER AS c ON caa.CUSTOMERID = c.CUSTOMERID
where ISNULL(caa.BUS_TYPE,'') != ISNULL(c.BUS_TYPE,'')
AND (ISNULL(caa.BUS_TYPE,'') = '' OR ISNULL(c.BUS_TYPE,'') = '')
AND ISNULL(c.BUS_TYPE,'') = ''
AND DATEDIFF(dd, CONVERT(date, caa.LastModified), GETDATE()) <= 30 -- last 30 days filter
UNION
-- for records which are deleted
SELECT UPPER(caa.Comments) + ' Record' 'SQLAction'
,'' AS CurrentBusType
, caa.BUS_TYPE AS PrevBusType
, caa.LastModified
, caa.CUSTOMERID
, caa.NAME
, caa.ADDRESS1
, caa.ADDRESS2
, caa.CITY
, caa.STATE
, caa.ZIP
FROM CUSTOMER_Audit AS caa
WHERE caa.Comments LIKE '%Deleted%'
AND DATEDIFF(dd, CONVERT(date, caa.LastModified), GETDATE()) <= 30
ORDER BY caa.LastModified DESC
如何仅为在发送带有某些记录的上一封电子邮件后添加的最后一条记录发送电子邮件。
新电子邮件不应发送已在上一封电子邮件中发送的更新/删除的记录。
我尝试在 Sharepoint 中使用快照,但它正在发送所有快照,其中包含已发送的相同记录(以及新记录(如果有的话)。不知道我是否在那里做错了什么。
或者,我是否应该将 SQL 查询调整为仅显示最新记录?但是我该怎么做呢?
我的 SQL Server 是 2008 R2。
答:
2赞
Dale K
11/3/2023
#1
一个非常简单的解决方案是创建一个表格,该表格记录了报表上显示的最后一条记录,例如
CREATE TABLE dbo.ReportHistory (
-- Following is a way to identify the report, could be plain text
-- Could be the ID of the report in SSRS
Report varchar(128)
, LastIdQueried bigint
)
然后,每次运行报表时,都会更新此表。并且假设您通过存储过程提取结果。
但是,这是有问题的,因为如果从 SSRS 手动运行报表,而不通过电子邮件发送结果,则不会收到有关结果的通知。
因此,在这种情况下,我倾向于创建自己的快照,在我选择的时间触发代理作业,然后显示此静态快照中的数据。我对此快照(简化)的架构是:
CREATE TABLE dbo.ReportInstance (
Id bigint NOT NULL IDENTITY (1,1) PRIMARY KEY CLUSTERED,
DateOfReportRun datetime2(0) NULL,
-- Following is a way to identify the report, could be plain text
-- Could be the ID of the report in SSRS
Report varchar(128) NULL
);
CREATE TABLE dbo.ReportInstanceItem (
Id bigint NOT NULL IDENTITY (1,1) NOT NULL PRIMARY KEY CLUSTERED,
ReportInstance bigint NULL REFERENCES dbo.ReportInstance(Id),
-- Store the ids from the target table which are part of this report
RecordId bigint NULL
);
评论
0赞
PrettyCode
11/3/2023
您的解决方案似乎非常令人印象深刻。再问几个问题。当存储的 proc 与报表服务器 db 位于不同的服务器 db 上时,如何从存储的 proc 在 reportHistory 中插入数据?在第二种解决方案中,您的意思是我必须在实际数据库服务器上创建一个 sql 代理作业并在 ReportInstance 和 ReportInstanceItem 中插入值?
0赞
Dale K
11/3/2023
1) 无论选择存储数据,您都将其存储在实际数据库中,而不是 SSRS 数据库中。2) 更正您正在构建自己的报表快照,同样是在您自己的数据库中,而不是 SSRS。
评论