我正在尝试将一列从一个表移动到另一个表(这是帖子(,
但是,这作为任务运行,并且可能会在完成之后运行,因此我需要一个子句来防止逻辑再次运行。我以为我可以通过 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相比的作用的好文章,但它基本上归结为更多的注射预防。