【问题标题】:SQL Server trigger with error message带有错误消息的 SQL Server 触发器
【发布时间】:2017-08-04 06:21:24
【问题描述】:

我写了一个触发器,如果​​在两列中发现重复记录,它会阻止重复记录。

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

代码:

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

【问题讨论】:

  • 添加更多关于预期输出的细节
  • 您为什么要为此使用触发器?因为这件事你可以在你的插入存储过程中做。
  • 这可能会使非重复记录也不会因为批处理中存在一个重复而插入
  • UNIQUE 约束可以应用于多个列。此处无需编写触发器。
  • 正是这不允许插入非重复,我试图在打印语句中显示错误行

标签: sql-server tsql database-trigger


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多