SQL Server触发器,显示错误消息

时间:2017-08-04 06:21:24

标签: sql-server tsql database-trigger

如果在两列中找到,我编写了一个阻止重复记录的触发器。

如何在消息中抛出导致重复的行。 我试图在错误消息中显示这些错误行。

代码:

CREATE TRIGGER [dbo].[BlockDuplicates]
 ON [dbo].[table]
 INSTEAD OF INSERT
AS
BEGIN
  SET NOCOUNT ON;

  IF NOT EXISTS (SELECT 1 FROM inserted AS i 
    INNER JOIN dbo.WSP_INPUT_ACTV AS t
    ON i.GoogleID = t.GoogleID
    AND i.SKU = t.SKU

     WHERE i.FleetID <> 008
  )
  BEGIN
    INSERT dbo.WSP_INPUT_ACTV (COL1,COL2,COL3)
      SELECT COL1,COL2,COL3 FROM inserted;
  END
  ELSE
  BEGIN
    PRINT 'INSERTION ABORTED';
  END
END

1 个答案:

答案 0 :(得分:1)

更改触发器的逻辑,以便它执行EXISTS(或者从插入的虚拟表中加入的表中提取一些值,如果您要特别提及错误消息中的一些/所有错误值)并且值已经存在,调用RAISERROR后跟ROLLBACK TRANSACTION

如果尚未存在任何值,请完成触发器并插入/提交您的值。这样的事情(可能需要一些调试,目前在iPad上,对不起),但请注意它只选择一个坏对。如果你希望你的错误信息包含所有坏对,那可能是huuuuuge ..

CREATE TRIGGER [dbo].[BlockDuplicates]
 ON [dbo].[table]
 INSTEAD OF INSERT
AS
BEGIN
  SET NOCOUNT ON;
  DECLARE @dupes VARCHAR(100);

  SELECT @dupes = MAX(CONCAT(I.GoogleID, '/', I.sku)) FROM inserted AS i 
    INNER JOIN dbo.WSP_INPUT_ACTV AS t
    ON i.GoogleID = t.GoogleID
    AND i.SKU = t.SKU

     WHERE i.FleetID <> 008
  )

  IF @dupes IS NULL THEN 
  BEGIN
    INSERT dbo.WSP_INPUT_ACTV (COL1,COL2,COL3)
      SELECT COL1,COL2,COL3 FROM inserted;
    COMMIT TRANSACTION;
  END
  ELSE
  BEGIN
    RAISERROR('CONCAT(googleid/sku pair ',@dupes,' is already present'),-1,-1);
    ROLLBACK TRANSACTION;
  END
END