2

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

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。

4

2 回答 2

2

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

要使您的代码正常工作,您需要将 UPDATE 和 ALTER 语句作为字符串传递给EXECUTEor EXEC sp_executesql

另见Q2586737

于 2013-02-21T22:08:32.673 回答
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
于 2013-02-21T22:43:54.563 回答