У меня проблемы с получением количества аффектных строк моим триггером. Я не уверен, как реализовать @@rowcount в моем триггере, чтобы он мог быть создан и работать правильно. По сути, этот триггер должен либо удалять, либо вставлять поставщиков в таблицу и возвращать прерванное или успешное сообщение. Мне нужна какая-то переменная для подсчета строк, и именно здесь у меня возникают проблемы.

Что у меня пока что с синтаксическими и контекстными ошибками:

CREATE TRIGGER tgr_limitTotalSupplier 
ON Suppliers_copy
AFTER INSERT, DELETE
AS
BEGIN
    DECLARE @R int;
    SET NOCOUNT ON;

    IF (SELECT COUNT(*) FROM Suppliers_copy) > 29
    BEGIN
        ROLLBACK TRANSACTION;
        RAISERROR ('Total suppliers cannot beyond 29. Your INSERT is aborted.', 16,1)
    END
    ELSE
    BEGIN
        R = SELECT COUNT(*) FROM inserted
        PRINT (R+ ' suppliers are inserted successfully');
    END

    IF (SELECT COUNT(*) FROM Suppliers_copy) > 29
    BEGIN
        ROLLBACK TRANSACTION;
        RAISERROR ('Total suppliers cannot below 25. Your DELETE is aborted.', 16,1)
    END
    ELSE
        R = SELECT COUNT(*) FROM deleted

    PRINT (R+ ' suppliers are inserted successfully');  
    RETURN
END;

Я получаю ошибку

Неверный синтаксис рядом с 'R'

Когда я пытаюсь

R = SELECT COUNT(*) FROM inserted

И

Название «R» не допускается в этом контексте. Допустимые выражения - это константы, константные выражения и (в некоторых контекстах) переменные. Имена столбцов не допускаются.

На моей линии:

PRINT (R + ' suppliers are inserted successfully');

Я не уверен что делать. Я еще не использовал @@rowcount, потому что это вызывает еще больше ошибок, чем это.

0
Chris 19 Апр 2020 в 17:43

2 ответа

Лучший ответ

Триггеры не должны выводить сообщения, кроме сообщений об ошибках при сбое (или, возможно, для отладки). Клиент получит обычное сообщение о количестве строк из DML, если триггер имеет SET NOCOUNT ON.

Так что это должно быть просто:

CREATE OR ALTER TRIGGER tgr_limitTotalSupplier 
ON Suppliers_copy
AFTER INSERT, DELETE
AS
BEGIN
    DECLARE @R int;
    SET NOCOUNT ON;

    IF (SELECT COUNT(*) FROM Suppliers_copy) > 29
    BEGIN
        ROLLBACK TRANSACTION;
        RAISERROR ('Total suppliers cannot beyond 29. Your INSERT is aborted.', 16,1);
        RETURN;
    END

    IF (SELECT COUNT(*) FROM Suppliers_copy) < 25
    BEGIN
        ROLLBACK TRANSACTION;
        RAISERROR ('Total suppliers cannot below 25. Your DELETE is aborted.', 16,1);
        RETURN;
    END

END;
1
David Browne - Microsoft 19 Апр 2020 в 15:13

Предположительно, вы намереваетесь что-то вроде этого:

declare @R int;

select @R = count(*)
from inserted;

print concat(@R, ' suppliers are inserted successfully');
0
Gordon Linoff 19 Апр 2020 в 14:53