0

我正在尝试在表上设置触发器,以便在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
4

1 回答 1

3

1)您正在制作经典的触发器 101 错误,并将inserted表格视为只有一行。它将具有与插入/更新一样多的行,您必须相应地处理它,即作为基于集合的操作。

2)你不混合SETSELECT你使用合适的。

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
于 2018-12-19T00:42:16.890 回答