Неверный синтаксис при создании триггера - PullRequest
0 голосов
/ 20 сентября 2019

Я пытаюсь создать триггер на одной из моих таблиц в БД, как показано ниже

CREATE TRIGGER tr_JTIA_ForInsert
ON MyTable
FOR INSERT 
AS
BEGIN
    DECLARE @JTIItemID INT,
            @UserWWID INT

    IF EXISTS (SELECT * 
               FROM [MyTable] JTIA 
               INNER JOIN inserted NewItem ON NewItem.ItemID = JTIA.ItemID 
                                           AND NewItem.UserWWID = JTIA.UserWWID 
                                           AND NewItem.Status = JTIA.Status)
    BEGIN
        SELECT 
            @JTIItemID = inserted.ItemID, 
            @UserWWID = inserted.UserWWID 
        FROM
            inserted

        EXEC msdb.dbo.sp_send_dbmail
              @recipients = 'edwin@gmail.com', 
              @profile_name = 'App Administrator',
              @body = SELECT CONCAT('User : ',(SELECT CONVERT(varchar(20),12345)), ' was assigned a duplicate JTIItemID: ', (SELECT CONVERT(varchar(20),1234567)), ' at timestamp: ', (select convert(varchar, getdate(), 22))),
              @subject = 'Duplicate record Was Assigned to user:'; 
    END
END

Когда я выполняю вышеуказанный триггер, я получаю сообщение об ошибке belwo при создании.

Сообщение 156, Уровень 15, Состояние 1, Процедура tr_JTIA_ForInsert, Строка 16 [Стартовая строка 0]
Неверный синтаксис рядом с ключевым словом «ВЫБОР».

Сообщение 137, Уровень 15, Состояние 1, Процедураtr_JTIA_ForInsert, строка 17 [Batch Start Line 0]
Необходимо объявить скалярную переменную "@subject".

Не уверен, что мне не хватает

1 Ответ

0 голосов
/ 20 сентября 2019

Вот грубый переработанный пример того, что вам нужно.У меня нет стола, поэтому я не могу его проверить, но подозреваю, что он довольно близок.

CREATE TRIGGER tr_JTIA_ForInsert
ON dbo.MyTable
AFTER INSERT 
AS
BEGIN
    SET NOCOUNT ON;
    SET XACT_ABORT ON;

    DECLARE @JTIItemID int;
    DECLARE @UserWWID int;
    DECLARE @EmailBody nvarchar(max);

    DECLARE @EmailsToSend TABLE
    (
        EmailsToSendID int NOT NULL IDENTITY(1,1) PRIMARY KEY,
        JTIItemID int,
        UserWWID int
    );

    INSERT @EmailsToSend (JTIItemID, UserWWID)
    SELECT i.JTIItemID, i.UserWWID
    FROM inserted AS i
    INNER JOIN dbo.MyTable AS mt
    ON mt.ItemID = i.ItemID 
    AND mt.UserWWID = i.UserWWID
    AND mt.[Status] = i.[Status];

    DECLARE @Counter int = 1;
    WHILE @Counter <= (SELECT MAX(EmailsToSendID) FROM @EmailsToSend)
    BEGIN
        SELECT @JTIItemID = ets.JTIItemID,
               @UserWWID = ets.UserWWID
        FROM @EmailsToSend AS ets
        WHERE ets.EmailsToSendID = @Counter;

        SET @EmailBody = CONCAT(N'User : ',
                                (SELECT CONVERT(varchar(20),12345)), 
                                N' was assigned a duplicate JTIItemID: ', 
                                (SELECT CONVERT(varchar(20),1234567)), 
                                N' at timestamp: ', 
                                (SELECT convert(varchar, GETDATE(), 22)));

        EXEC msdb.dbo.sp_send_dbmail
              @recipients = N'edwin@gmail.com', 
              @profile_name = N'App Administrator',
              @body = @EmailBody,
              @subject = N'Duplicate record Was Assigned to user:'; 
        SET @Counter += 1;
    END;
END;
GO

Надеюсь, что это поможет вам.

...