TSQL触发器而不是插入

时间:2016-10-19 13:18:17

标签: sql-server tsql triggers insert

我需要在某个表中插入后替换其中一个列值(如果它与禁止值匹配)。

示例:

INSERT INTO [dbo].[TEST_A]
           ([COL_A]
           ,[COL_B])
     VALUES
           ('TEST'
           ,'TEST1')

TEST1是一个禁止值,我想在'BANNED'中替换它。

这是我写的触发器,但似乎工作得很好:

CREATE TRIGGER [dbo].[TEST_NAME_INS] ON [dbo].[TEST_A]
 INSTEAD OF INSERT
AS
BEGIN
    INSERT INTO TEST_A
    (COL_A
    ,COL_B)
    SELECT 
    COL_A
   ,REPLACE(COL_B, 'TEST1', 'BANNED')
   FROM inserted
   WHERE INSERTED.COL_B IN ('TEST1')

错误是如果我在COL_B中插入不同的值,则不会插入任何行。

你能给我一个解决方案吗?

提前致谢

2 个答案:

答案 0 :(得分:4)

如果您有多于您想要放入案例陈述的值,您可以尝试使用表来存储被禁止的单词并替换它们。然后在插入中加入,例如:

CREATE TRIGGER [dbo].[TEST_NAME_INS] ON [dbo].[TEST_A]
 INSTEAD OF INSERT
AS
BEGIN
    INSERT INTO TEST_A
    (COL_A
    ,COL_B)
    SELECT 
    COL_A
   ,CASE WHEN b.banned is null then i.col_b
         ELSE b.replacement
    END
   FROM inserted i
   LEFT JOIN Banned b on i.col_B = b.banned

答案 1 :(得分:2)

您需要修改触发器。

CREATE TRIGGER [dbo].[TEST_NAME_INS] ON [dbo].[TEST_A]
 INSTEAD OF INSERT
AS
BEGIN
    INSERT INTO TEST_A
    (COL_A
    ,COL_B)
    SELECT 
    COL_A
   ,CASE WHEN COL_B ='TEST1' THEN 'BANNED'
         WHEN COL_B ='TEST12' THEN 'BANNED34'
         ELSE COL_B END

   FROM inserted