SQL Server:在触发器中引发错误以返回插入行列

时间:2018-12-19 00:34:29

标签: sql sql-server dynamic-sql raiseerror

我正在尝试在表上设置触发器,以便在满足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 :(得分:3)

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

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