代码之家  ›  专栏  ›  技术社区  ›  Jenny Tran

当A列等于B列时创建触发器

  •  0
  • Jenny Tran  · 技术社区  · 6 年前

    我试图在SQL Server中创建一个触发器,以便在A列等于B列时自动在另一列中插入值,否则,请在其中插入另一个值。

    例如,如果cola不等于colb,则在列得分中插入“错误”。如果cola等于colb,则在列得分中插入'correct'。

    我在下面试过了,它不起作用。

    如何将此更改为工作状态?

    CREATE TABLE testtrigger(
    ID INT identity(1,1) primary key,
    ColA varchar(50),
    ColB varchar(50),
    Score varchar(50)
    );
    GO
    
    CREATE TRIGGER trgAfterInsertUpdate 
       ON testtrigger
       AFTER INSERT, UPDATE
    AS
    BEGIN
       SET NOCOUNT ON;
       IF UPDATE, INSERT
       BEGIN
          UPDATE testtrigger
          SET Score = correct
          WHERE ColA = ColB
       ELSE
          SET Score = wrong
          WHERE ColA <> ColB
       END
    END
    

    谢谢。

    4 回复  |  直到 6 年前
        1
  •  2
  •   Sreenu131    6 年前

    您可以在SQL Server中使用case或iif(),请尝试此操作

       CREATE TRIGGER trgAfterInsertUpdate 
       ON testtrigger
       AFTER INSERT, UPDATE
       AS
       BEGIN
       SET NOCOUNT ON;
    
          UPDATE t
          SET t.Score = (CASE WHEN t.ColA = t.ColB THEN  'Correct' 
                              WHEN  t.ColA <> t.ColB THEN 'Wrong' END)
          FROM testtrigger t
          INNER JOIN  inserted i ON t.ID=i.ID
    
    
          -- UPDATE t
          -- SET t.Score = (IIF( t.ColA = t.ColB,'Correct','Wrong'))
          -- FROM testtrigger t
          -- INNER JOIN  inserted i ON t.ID=i.ID
    
       END
    
    INSERT INTO Testtrigger(ColA, ColB) VALUES
    ('G', 'G'),
    ('H', 'A');
    
    SELECT *
    FROM Testtrigger
    

    结果

    ID  ColA    ColB    Score
    -------------------------
    1   A        B      wrong
    2   A        A      correct
    3   G        G      correct
    4   H        A      wrong
    
        2
  •  4
  •   Ilyes    6 年前

    那就做一个 Score 计算列为

    CREATE TABLE testtrigger(
    ID INT identity(1,1) primary key,
    ColA varchar(50),
    ColB varchar(50),
    Score AS CASE WHEN ISNULL(ColA, 0) = ISNULL(ColB, 0) THEN 'Correct' ELSE 'Wrong' END
    );
    
    INSERT INTO Testtrigger(ColA, ColB) VALUES
    ('A', 'B'),
    ('A', 'A');
    
    SELECT *
    FROM Testtrigger;
    

    更新:

    如果已经创建了表,则可以

    ALTER TABLE testtrigger
    DROP COLUMN Score;
    
    ALTER TABLE testtrigger
    ADD Score AS CASE WHEN ISNULL(ColA, 0) = ISNULL(ColB, 0) THEN 'Correct' ELSE 'Wrong' END PERSISTED;
    
        3
  •  2
  •   StepUp    6 年前

    不能设置为 int Score 列A varchar 值,但可以设置 0 1 价值观。 意味着错误, 意味着正确。 让我举个例子:

    CREATE TRIGGER trgAfterInsertUpdate 
       ON testtrigger
       AFTER INSERT, UPDATE
    AS
    BEGIN
       SET NOCOUNT ON;
       IF UPDATE(ColA)   
       BEGIN      
          UPDATE t
          SET score = CASE 
                        WHEN t.ColA = i.ColB THEN 1
                        ELSE 0
                      END
          FROM dbo.testtrigger t
          INNER JOIN INSERTed i ON t.ID = i.ID    
       END
    END
    

    或者改变你的 Score 列到 VARCHAR(20) :

    CREATE TABLE testtrigger(
    ID INT identity(1,1) primary key,
    ColA varchar(50),
    ColB varchar(50),
    Score varchar(20)
    );
    
        4
  •  1
  •   Ehssan    6 年前

    我想你只是错过了片场

    CREATE TABLE testtrigger(
    ID INT identity(1,1) primary key,
    ColA varchar(50),
    ColB varchar(50),
    Score varchar(50)
    );
    GO
    
    CREATE TRIGGER trgAfterInsertUpdate 
       ON testtrigger
       AFTER INSERT, UPDATE
    AS
    BEGIN
       SET NOCOUNT ON
    
       UPDATE testtrigger
       SET Score = 'correct'
       WHERE ColA = ColB
    
       UPDATE testtrigger
       SET Score = 'wrong'
       WHERE ColA <> ColB
    
    END