【问题标题】:SQL, T-SQL. TRIGGER or PROCEDURE to duplicate the last row inserted by changing only some valuesSQL,T-SQL。通过仅更改某些值来复制插入的最后一行的 TRIGGER 或 PROCEDURE
【发布时间】:2015-03-20 23:50:29
【问题描述】:

我有一张这样的桌子:

|---------------PLAYERS-----------------|
| ID | NAME | GAMES | BUTTON | OPPONENT |
|---------------------------------------|
| 50 | BOB  | 00345 | RED    |   BIM    |
| 10 | JOHN | 00001 | YELLOW |   ALI    |
| 01 | ALI  | 00002 | GREEN  |   JOHN   |

http://sqlfiddle.com/#!2/93cc5/2

我需要一个 TRIGGER 或 PROCEDURE,当新行在“BUTTON”列中包含单词“YELLOW”或“RED”时,我想通过仅更改一些值来复制最后一行。

示例:

我有这个新行要写:

| 51 | JOHN | 00001 | YELLOW | MIKE |

使用“黄色”按钮,我希望 sql 先插入该行,然后插入这样的新行(对手列为 NULL):

| 52 | JOHN | 00002 | YELLOW | NULL |

还有这样一排(麦克是第一排的对手):

| 53 | MIKE | 00851 | YELLOW | NULL |

如何做到这一点?

【问题讨论】:

  • 过去的行如何进入inserted 表?我错过了什么?
  • 亲爱的@Raj,我删除了不起作用的代码。我在 Stack 上显然知道该怎么做,也许像你这样的人用不同的想法启发了我。

标签: sql-server tsql stored-procedures triggers sql-server-2012


【解决方案1】:

您需要记住,SQL Server 中的触发器为每个语句运行一次 - 因此inserted 中可能有 多个 行(或没有行),其中一些可能符合您的条件其他没有。

在这种情况下,我认为最干净的做法是使用INSTEAD OF 触发器而不是后触发器:

CREATE TRIGGER T_Players_I ON Players
INSTEAD OF INSERT
AS
    ;With Dupl as (
       SELECT Name,Games,Button,Opponent,i
       FROM inserted
             cross join
            (select 0 union all select 1) t(i)
    )
    INSERT INTO Players (Name,Games,Button,Opponent)
    SELECT
       CASE WHEN Button IN ('Red','Yellow') AND i = 1 THEN Opponent ELSE Name END,
       Games,Button,
       CASE WHEN Button IN ('Red','Yellow') THEN NULL ELSE Opponent END
    FROM
       Dupl
    WHERE i = 0 OR Button IN ('Red','Yellow')

【讨论】:

  • 亲爱的@Damien,我需要插入第一行(新行),然后我需要具有新值的新行。所以,我需要第一个插入,然后是触发器。现在清楚了吗?
猜你喜欢
  • 1970-01-01
  • 2021-06-18
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-05
  • 2014-04-02
相关资源
最近更新 更多