Sql server 如果某列没有';如果表没有';不存在?

Sql server 如果某列没有';如果表没有';不存在?,sql-server,sql-server-2008,Sql Server,Sql Server 2008,为什么MS Sql Server(2005和2008;未在其他地方测试)在表中不存在列时会引发错误,而在表不存在时会引发错误 更具体地说,我有以下模式(高度简化以显示所有重要内容): 为什么以下查询会失败,并出现错误无效列名“iDoNotExist”。 if 1=2 begin print 'table that shouldn''t exist does' select * from [IDoNotExist] end if 1=2 begin print 'col

为什么MS Sql Server(2005和2008;未在其他地方测试)在表中不存在列时会引发错误,而在表不存在时会引发错误

更具体地说,我有以下模式(高度简化以显示所有重要内容):

为什么以下查询会失败,并出现错误
无效列名“iDoNotExist”。

if 1=2
begin
    print 'table that shouldn''t exist does'
    select * from [IDoNotExist]
end

if 1=2 
begin
    print 'column that shouldn''t exist does'
    select iDoNotExist from table1
end
我希望它要么失败并出现多个错误(如果它实际编译并注意到表和列不存在的话),要么没有错误(如果它忽略了if语句的内容,因为它们不会运行的话)。我该怎么做才能让它运行而不出错

PS实际查询在if语句中有以下内容,但没有任何区别:

exists (select * from [INFORMATION_SCHEMA].[COLUMNS] t where t.[TABLE_NAME] = 'table1' and t.[COLUMN_NAME] = 'iDoNotExist')

您将看到for表的效果。

re:

我该怎么做才能让它运行而不出错

使用
EXEC
使语句在未编译的子批处理中运行,除非执行
IF
分支

IF 1 = 2
  BEGIN
      PRINT 'column that shouldn''t exist does'

      EXEC ('SELECT iDoNotExist FROM   table1')
  END  
另一种理论上的可能性是,通过添加对另一个不存在的表的No-Op引用来推迟编写有问题的语句

IF 1 = 2
  BEGIN
      PRINT 'column that shouldn''t exist does'

      CREATE TABLE #T(X INT)

      SELECT iDoNotExist
      FROM   table1, (SELECT MAX(X) X FROM   #T) T

      DROP TABLE #T
  END  

但是,无法想象任何情况下会比
EXEC
更有用。

您确定
如果1=2
对于两个SQL块都存在这样的
吗?在SQL Server 2008 Express Edition上,我可以创建该模式,然后运行该查询,并得到该错误;如果我注释掉选择列的行,我就得到了我想要的输出。
IF 1 = 2
  BEGIN
      PRINT 'column that shouldn''t exist does'

      CREATE TABLE #T(X INT)

      SELECT iDoNotExist
      FROM   table1, (SELECT MAX(X) X FROM   #T) T

      DROP TABLE #T
  END