2017-08-04 34 views
1

我写了一个触发器,它在两列中找到时会阻止重复记录。带有错误信息的SQL Server触发器

我该如何将消息中的行引起重复。 我想在错误消息中显示那些错误行。

代码:

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 
+0

添加有关为什么要使用触发此预期输出 –

+0

更多的细节?因为您可以在插入存储过程中执行此操作。 –

+0

这可以使非重复记录也不会因为批次中存在一个重复存在而被插入 –

回答

1

更改您的触发周围的逻辑,所以它的存在时(或拉动表中的某些数值加入王氏插入的虚拟表,如果你想特别提到的一些/所有的坏值在错误消息中),并且如果值已经存在,则调用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