代码之家  ›  专栏  ›  技术社区  ›  LAffair

基于插入的T-SQL触发器更新列

  •  0
  • LAffair  · 技术社区  · 6 年前

    我已经使用SQL查询几个星期了,我正在努力从错误中学习和理解。 我有一张有两列的桌子 IsInvisible (bit) Name (string) 当其中一个被更改为更新另一个时,另一个也类似于: -如果在要设置的名称前添加*号 IsInvisible 设置为1,如果*被移除,则将其设置为0 -如果IsInvisible设置为1以在名称前面添加*并且设置为0以删除它

    我试过这样的方法:

    CREATE TRIGGER [dbo].[updateInvisibility]
    ON [dbo].[myTable]
    FOR UPDATE
    AS
    BEGIN
    
    
    UPDATE myTable
    SET IsInvisible = 1 
    WHERE Id in (SELECT Id FROM inserted WHERE Name like '*%')
    
    UPDATE myTable
    SET IsInvisible = 0 
    WHERE Id in (SELECT Id FROM inserted WHERE Name not like '*%')
    
    UPDATE myTable
    SET Name = '*' + Name 
    WHERE Id in (SELECT Id FROM inserted WHERE IsInvisible = 1)
    
    end
    

    但在某些情况下,它会放两个*而不是一个,我不知道在另一种情况下如何删除。

    到目前为止,是否有方法根据我的查询正确更新列?不重复更新过程在某种程度上可以改进吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Gordon Linoff    6 年前

    你可以做你想做的事 UPDATE :

    UPDATE t
        SET IsInvisible = (CASE WHEN i.Name like '*%' THEN 1 ELSE 0 END),
            Name = (CASE WHEN i.IsInvisible = 1 AND t.name NOT LIKE '*%'
                         THEN '*' + t.name
                         ELSE t.name
                    END)
        FROM myTable t JOIN
             inserted i
             ON t.id = i.id;
    

    更重要的是,您将检查名称是否已经以 '*' .

    使用计算列可以完全消除对触发器的需要:

    alter table myTable add newName as ( case when IsInvisible = 1 then '*' + Name else Name end );
    

    价值 newName 在访问时计算,因此不需要触发器来更新它。