如果EXISTS不工作

时间:2013-02-21 21:01:32

标签: sql sql-server-2005

我正在尝试创建一个可重新运行的脚本

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。

2 个答案:

答案 0 :(得分:2)

T-SQL不是批处理脚本,解析器在执行之前检查整个语句。因此,如果子选择中的列不存在,则在执行之前检查将失败。

要使代码生效,您需要将UPDATE和ALTER语句作为字符串传递给EXECUTEEXEC 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