'IF'不能防止错误,只有在已经执行的情况下

时间:2018-08-20 14:27:12

标签: sql-server

我正在尝试将一列从一个表移动到另一表(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

错误是:

  

无效的列名“ internalID”。

但仅当 a.internalID不再存在。

1 个答案:

答案 0 :(得分:1)

我必须使用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

我猜是因为在运行脚本之前,SQL Server会编译整个内容-甚至包括通过条件逻辑绕过的内容。

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