我正在尝试创建一个可重新运行的脚本
IF EXISTS ((SELECT * from information_schema.columns where TABLE_SCHEMA=N'MySchema' and TABLE_NAME=N'Table1' AND COLUMN_NAME=N'Column1'))
BEGIN
PRINT 'Updating'
UPDATE [Table2]
SET Column = 0
WHERE Id IN (SELECT t2.Id
FROM [Table2] t2
JOIN [MySchema].[Table1] t1 ON t2.UserId = t1.UserId
WHERE t1.Column1 = 0)
ALTER TABLE [MySchema].[Table1] DROP COLUMN Column1
END
它第一次工作,但第二次出现错误
列名称“Column1”无效。
任何帮助将不胜感激。我之前使用sys.columns
检查列是否存在。它适用于SQL Server 2005。
答案 0 :(得分:2)
T-SQL不是批处理脚本,解析器在执行之前检查整个语句。因此,如果子选择中的列不存在,则在执行之前检查将失败。
要使代码生效,您需要将UPDATE和ALTER语句作为字符串传递给EXECUTE
或EXEC sp_executesql
。
另见Q2586737
答案 1 :(得分:1)
如果您可以将脚本分成批处理,可以使用SET NOEXEC
命令。
当列不存在时将其设置为ON。将UPDATE和ALTER TABLE放入单独的批处理中,即将其与具有GO
的条件分开。如果您的脚本中还有其他需要执行的语句(不依赖于条件),请添加另一个GO
并添加SET NOEXEC OFF
。
为了说明,这就是我的意思:
IF NOT EXISTS (
SELECT *
from information_schema.columns
where TABLE_SCHEMA=N'MySchema'
and TABLE_NAME=N'Table1'
AND COLUMN_NAME=N'Column1'
)
SET NOEXEC ON
GO
PRINT 'Updating'
UPDATE [Table2]
SET Column = 0
WHERE Id IN (SELECT t2.Id
FROM [Table2] t2
JOIN [MySchema].[Table1] t1 ON t2.UserId = t1.UserId
WHERE t1.Column1 = 0)
ALTER TABLE [MySchema].[Table1] DROP COLUMN Column1
GO
SET NOEXEC OFF
... -- the rest of the script, if any