我正在尝试将一列从一个表移动到另一表(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
不再存在。
答案 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 article是sql_executesql
的事,但基本上可以归结为更多的预防注射。