将触发器中的错误提高到 return 插入行列
Raise error in trigger to return insert row column
我正在尝试在 table 上设置触发器,以便在满足 RaiseError
条件时 returns 字符串中插入行的列值。
我正在努力将列值添加到错误消息中,我的想法是使用动态 SQL 但是我无法获取它 运行:
Incorrect syntax near the keyword 'Select'
关于如何将其发送到 运行 的任何想法?
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) 您犯了典型的触发器 101 错误,并且将 inserted
table 视为只有一行。它将有和 inserted/updated 一样多的行,你必须相应地处理它,即作为一个基于集合的操作。
2) 你不要混合使用 SET
和 SELECT
你使用合适的。
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
我正在尝试在 table 上设置触发器,以便在满足 RaiseError
条件时 returns 字符串中插入行的列值。
我正在努力将列值添加到错误消息中,我的想法是使用动态 SQL 但是我无法获取它 运行:
Incorrect syntax near the keyword 'Select'
关于如何将其发送到 运行 的任何想法?
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) 您犯了典型的触发器 101 错误,并且将 inserted
table 视为只有一行。它将有和 inserted/updated 一样多的行,你必须相应地处理它,即作为一个基于集合的操作。
2) 你不要混合使用 SET
和 SELECT
你使用合适的。
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