2014-06-09 56 views
0

我正在使用SQL Server 2008 R2。我已经创造了一些迁移的一些SQL语句:如何忽略SQL Server 2008 R2中的“无效列名”错误

IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='TableA' AND COLUMN_NAME='Status') 
BEGIN 
    UPDATE TableA 
    SET Status = 'Active' 
    WHERE Status IS NULL 
END 

现在,我已经从数据库表TableA下降列Status

再次当我执行上述块,虽然我已经把检查该列是否存在,只有那么就应该执行UPDATE声明,它给了我错误

无效列名“状态”

如何摆脱这个错误?

感谢

+0

另外我要求你为这个问题建议一些合适的标题。 :) – Dev

回答

2

你需要把代码在一个单独的范围/批运行:

IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS 
      WHERE TABLE_NAME='TableA' AND COLUMN_NAME='Status') 
BEGIN 

    EXEC('UPDATE TableA SET Status=''Active'' WHERE Status IS NULL') 

END 

您目前的问题是,该系统希望到编译你的一批代码在执行它的任何部分之前。它不能编译UPDATE声明,因为有一列缺少,所以它甚至没有机会启动执行的代码,并考虑是否EXISTS谓词返回true或false。

+0

按预期工作..!非常感谢.. :) – Dev

0

因为INFORMATION_SCHEMA是视图,而不是表您当前的SQL块可能会失败一些时间。另外,根据MSDN

Some changes have been made to the information schema views that break backward compatibility.

因此,我们不能依靠信息架构视图

而是使用SYS.TABLES

IF EXISTS(SELECT 1 FROM SYS.COLUMNS 
       WHERE NAME = N'Status' AND OBJECT_ID = OBJECT_ID(N'TableA')) 
BEGIN 
    UPDATE TableA SET Status='Active' WHERE Status IS NULL 
END 
+0

问题是我希望SQL Server避免列名“状态”是否存在与否。我已经放了一个检查,如果存在的列,那么只有它应该执行该块。此时“状态”列不存在,因此“UPDATE”语句不会被执行。仍然我收到错误“无效的列名称”。 – Dev