Почему MS Sql Server вызывает ошибку, если столбец в таблице не существует, прежде чем возникает ошибка, если таблица не существует? - PullRequest
4 голосов
/ 23 ноября 2011

Почему 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 ]

7 голосов
/ 23 ноября 2011

Вы видите эффект отложенного разрешения имен для таблиц.

2 голосов
/ 23 ноября 2011

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...