如果某个表不存在,如果某个列在表上不存在而引发错误之前,为什么MS Sql Server会引发错误?

时间:2011-11-22 22:05:42

标签: sql-server sql-server-2008

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

更具体地说,我有以下架构(高度减少以显示一切重要):

CREATE TABLE table1 (
id int identity(1,1) primary key
)

为什么以下查询失败并显示错误Invalid column name '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')

2 个答案:

答案 0 :(得分:7)

您正在看到deferred name resolution对表的影响。

答案 1 :(得分:2)

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的情况。