触发器使用内部联接发送邮件

时间:2017-10-31 10:49:52

标签: sql-server

我有2个表,ProductsGallery

Products
-----------
ID
Item_Name

Gallery
----------
Item_Id
Description

我试图在Gallery上编写一个简单的INSERT触发器来执行此操作 - 每次在Gallery中执行INSERT都会发送一封电子邮件。

使用此:

CREATE TRIGGER dbo.whatever
ON dbo.wherever
FOR INSERT
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @body NVARCHAR(MAX) = N'';

    SELECT @body += CHAR(13) + CHAR(10) + RTRIM(Description) FROM inserted;

    IF EXISTS (SELECT 1 FROM inserted WHERE speed > 100)
    BEGIN
        EXEC msdb.dbo.sp_send_dbmail
          @recipients = 'whoever@yourcompany.com', 
          @profile_name = 'default',
          @subject = 'At least one person was speeding', 
          @body = @body;
    END
END
GO

但是如何改进@BODY以便我可以使用Description from GalleryItem_Name from Products ??

准备好查询,但不知道怎么把它放在一起

select a.Item_Name, b.Description
FROM dbo.Gallery a
inner join dbo.Products b on a.Item_Id=b.ID

2 个答案:

答案 0 :(得分:1)

当您的触发器位于Gallery表上时,您可以将Inserted表加入Products以获得所需的结果,假设您当前的加入是正确的。

SELECT P.Item_Name, I.Description
FROM Inserted AS I
INNER JOIN dbo.Products AS P ON I.Item_Id = P.ID

这将返回新插入的描述以及相应的项目名称,但仅当该项目存在于Products中时才会生效。

然后,您可以设置@body,就像这样;

SELECT @body += CHAR(13) + CHAR(10) + 'Item Name: ' + P.Item_Name + ', Description: ' + RTRIM(I.Description)
FROM Inserted AS I
INNER JOIN dbo.Products AS P ON I.Item_Id = P.ID

答案 1 :(得分:0)

你几乎已经这样做了:

select @body += CHAR(13) + CHAR(10) + RTRIM(Description) 
FROM inserted a
inner join dbo.Products b 
    on a.Item_Id=b.ID

您需要将inserted表用作JOIN表。它与dbo.Gallery表具有相同的结构,但只保留新插入的记录。

相关问题