'IF'不能防止错误,但前提是它已经执行



我正在尝试将一列从一个表移动到另一个表(这是帖子(,

但是,这作为任务运行,并且可能会在完成之后运行,因此我需要一个子句来防止逻辑再次运行。我以为我可以通过 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

错误是:

列名称"内部 ID"无效。

但前提是a.internalID不再存在。

我不得不使用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在运行脚本之前符合整个事情 - 即使是通过条件逻辑绕过的东西。

这是一篇关于sql_executesql与EXEC相比的作用的好文章,但它基本上归结为更多的注射预防。

相关内容

  • 没有找到相关文章

最新更新