代码之家  ›  专栏  ›  技术社区  ›  Travis Heeter

“IF”不阻止错误,但仅当它已执行

  •  1
  • Travis Heeter  · 技术社区  · 6 年前

    我想把一列从一张桌子移到另一张桌子( here's the post for that ),

    但是,这是作为任务运行的,并且可能在任务完成后运行,因此我需要一个防止逻辑再次运行的子句。我想我可以用一个IF:

    IF EXISTS ( 
        SELECT * 
        FROM sys.columns 
        WHERE object_id = OBJECT_ID(N'Table_A')
            AND name = 'internalID'
    )
    BEGIN
        UPDATE Table_B
            SET b.internalID = a.internal_ID
        FROM Table_B b INNER JOIN
                Table_A a
                ON a.id = b.FK_toTableA;
    
        ALTER TABLE Table_A DROP COLUMN internalID;
    END
    

    但是,我在

    SET b.internalID = a.internal_ID
    

    错误是:

    但前提是 a.internalID 已经不存在了。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Travis Heeter    6 年前

    我不得不用 EXEC sp_executesql :

    IF EXISTS ( 
        SELECT * 
        FROM sys.columns 
        WHERE object_id = OBJECT_ID(N'Table_A')
            AND name = 'internalID'
    )
    BEGIN
        EXEC sp_executesql N'UPDATE Table_B
                SET b.internalID = a.internal_ID
            FROM Table_B b INNER JOIN
                    Table_A a
                    ON a.id = b.FK_toTableA';
    
        ALTER TABLE Table_A DROP COLUMN internalID;
    END
    

    这是 a good article sql_executesql 是的,与EXEC相比,但基本上可以归结为更多的预防注射。