SQl Server 2008 R2 - 我有一个触发器,它设置为向特定电子邮件地址发送电子邮件,该地址由第三方系统监控,该系统根据该消息的主题向某些人群发送消息。对此的限制是,每条消息的主题中只能有一个组号。但是我需要将相同的消息从触发器发送到至少两个组,这意味着必须使用两个不同的主题行生成两封单独的电子邮件。我在想触发器中的光标可能会完成此操作,但我不确定如何编写它。因此,在下面的代码中,我有@cat,每次触发器启动时,我都需要在其中发送一封主题为“ED”的电子邮件。然后,我需要根据当前用于设置主题行的案例语句的条件发送另一封电子邮件,其中主题正在设置。我已按如下方式更新了代码,并通过删除标量变量已移至基于集合的触发器(??)我还创建了信息并将其插入到“电子邮件”表中,该表将设置一个服务来运行每个10 秒并通过电子邮件发送所有设置为 0 的记录,然后将标志更新为 1。
新代码 -
CREATE TABLE [dbo].[tb_BatchEmail] (
[BatchEmailID] [bit] NOT NULL DEFAULT 0
,[To] [varchar](50) NOT NULL DEFAULT 'someemail' --will never change
,[Body] [varchar](255) NULL
,[Subject] [varchar](20) NOT NULL
,[Profile] [varchar](50) NOT NULL DEFAULT 'Alert' --will never change
,[OrderID] [varchar] (25) NULL
,[OrderDateTime] [datetime] NULL
,[SentDateTime] [datetime] NULL
,CONSTRAINT msg_pk PRIMARY KEY CLUSTERED (BatchEmailID)
) ON [PRIMARY]
GO
ALTER TRIGGER [dbo].[VeOrders] ON [dbo].[Orders]
FOR INSERT
AS
SELECT @visitid = i.VisitID
,@priority = Priority
,@cat = Category
,@procedure = OrderedProcedureName
,@orderid = OrderID
,@orderdate = OrderDateTime
,@locationid = CurrentLocationID
,@roomid = CASE
WHEN RoomTreatmentID IS NULL
THEN 'No Room#'
ELSE RoomTreatmentID
END
FROM inserted i
INNER JOIN livedb.dbo.EdmPatients edp
ON edp.VisitID = i.VisitID
WHERE Priority = 'STAT'
AND Category IN ('CT', 'MRI', 'XRAY', 'US', 'NUC', 'ECHO')
AND CurrentLocationID = 'ED'
IF @cat IN ('CT', 'MRI', 'XRAY', 'US', 'NUC', 'ECHO')
AND @priority = 'STAT'
AND @locationid = 'ED'
BEGIN
DECLARE @msg VARCHAR(500)
DECLARE @subject VARCHAR(500)
SET @msg = @roomid + '-' + @procedure + '-' + @priority + '.' --+ 'Order DateTime/Number ' + @order + '/+ @locationid + ' ' + @orderid
SET @subject = CASE
WHEN @cat = 'US'
THEN 'Test Ultra Sound'
WHEN @cat = 'CT'
THEN 'Test C T'
WHEN @cat = 'XRAY'
THEN 'Test X-Ray'
END
INSERT INTO livedb.dbo.tb_BatchEmail (
Body
,[Subject]
,OrderID
,OrderDateTime
)
SELECT Body = @msg
,[Subject] = @subject
,OrderID = @orderid
,OrderDateTime = @orderdate
END
旧代码 -
ALTER TRIGGER [dbo].[VeOrders] ON [dbo].[Orders]
FOR INSERT
AS
IF NOT EXISTS (
SELECT *
FROM dbo.EdmPatients
WHERE CurrentLocationID = 'ED'
)
RETURN
DECLARE @priority VARCHAR(50)
DECLARE @cat VARCHAR(50)
DECLARE @procedure VARCHAR(50)
DECLARE @orderid VARCHAR(50)
DECLARE @locationid VARCHAR(10)
DECLARE @roomid VARCHAR(10)
DECLARE @visitid VARCHAR(50)
SELECT @visitid = VisitID
,@priority = Priority
,@cat = Category
,@procedure = OrderedProcedureName
,@orderid = OrderID
,@locationid = CurrentLocationID
,@roomid = CASE
WHEN RoomTreatmentID IS NULL
THEN 'No Room#'
ELSE RoomTreatmentID
END
FROM inserted i
INNER JOIN dbo.EdmPatients edp
ON edp.VisitID = i.VisitID
WHERE Priority = 'STAT'
AND Category IN ('CT', 'MRI', 'XRAY', 'US', 'NUC', 'ECHO')
AND CurrentLocationID = 'ED'
IF @cat IN ('CT', 'MRI', 'XRAY', 'US', 'NUC', 'ECHO')
AND @priority = 'STAT'
AND @locationid = 'ED'
BEGIN
DECLARE @msg VARCHAR(500)
DECLARE @subject VARCHAR(500)
SET @msg = @roomid + '-' + @procedure + '-' + @priority + '.'
SET @subject = CASE
WHEN @cat = 'CT'
THEN '55194'
WHEN @cat = 'US'
THEN '59843'
WHEN @cat = 'XRAY'
THEN '70071'
END
EXEC msdb.dbo.sp_send_dbmail
@recipients = N'someemail'
,@body = @msg
,@subject = @subject
,@profile_name = 'Alerts'
END