SQL Server: вызвать ошибку в триггере для возврата столбца вставки строки - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь настроить триггер для таблицы, чтобы при выполнении условия RaiseError возвращалось значение столбца вставленной строки в строку.

Я изо всех сил пытаюсь получить столбецзначение в сообщении об ошибке, я думал, что использовать динамический SQL, однако я не могу его запустить:

Неверный синтаксис рядом с ключевым словом «Выбрать»

Любые мыслио том, как заставить это работать?

AFTER INSERT, UPDATE
AS
    IF (ROWCOUNT_BIG()  = 0)
        RETURN;
    ELSE IF EXISTS (SELECT * FROM inserted AS a
                    WHERE Label  = '0')
    BEGIN
        DECLARE @Error VARCHAR(100)
        DECLARE @UpdateError VARCHAR(100)
        DECLARE @Lay_Class VARCHAR(50)

        SET @Lay_Class = (SELECT [Lay_Class] FROM inserted);
        SET @UpdateError = 'Set @error = ''Error: ' + @Lay_Class + ' New Lay Class, Please add to Case When on Label''';

        EXEC sp_executesql @UpdateError;

        RAISERROR(@Error, 16, 1);
        ROLLBACK TRANSACTION;

        RETURN;
    END
    ELSE ... etc

1 Ответ

0 голосов
/ 19 декабря 2018

1) Вы делаете классическую ошибку триггера 101 и обрабатываете вставленную таблицу так, как будто она содержит только одну строку.В нем будет столько строк, сколько было вставлено / обновлено, и вам придется обрабатывать это соответственно, т.е. как операцию на основе набора.

2) Вы не смешиваете SET и SELECT, вы используете соответствующиеone.

3) THROW теперь рекомендуется более RAISEERROR

Следующие действия могут сделать то, что вам нужно:

IF (ROWCOUNT_BIG()  = 0)
    RETURN;
ELSE IF EXISTS (
    SELECT * FROM inserted AS a
    WHERE Label  = '0'
)
BEGIN
    DECLARE @Error varchar(100)
    declare @Lay_Class  varchar(50)

    select top 1 @Lay_Class = [Lay_Class] FROM inserted where Label  = '0';
    set @error = 'Error: ' + @Lay_Class + ' New Lay Class, Please add to Case When on Label';

    THROW 51000, @Error, 1;

    ROLLBACK TRANSACTION;
END
...