2015-02-21 4 views
1

Я выполняющийся ниже заявление на Sql Server 2012. Но он всегда выполнять, даже если столбец оленья кожа существоватьЕсли Exists заявление не работает

IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'Table1' AND COLUMN_NAME = 'Age') 
begin 
    Print 'in' 
    Update Table1 set Age = Null 

End 

Я также попытался ниже

if exists(select * from sys.columns 
     where Name = 'Age' and Object_ID = Object_ID('Table1')) 

Выполнение как заявление дает ошибку Invalid column name Age

Не понимаю, почему он заходит внутри Begin блок.

+0

Правильная схема? (У кого-то еще может быть другая таблица1 ...) – jarlh

+0

Нет, это не так. – Happy

+0

Ваш возрастный столбец существует? –

ответ

3

Операция exists работает. Проблема заключается в том, что update. Ваш код компилируется до запущен if. Таким образом, ошибка возникает на этапе компиляции.

Вы можете исправить это с помощью динамического SQL:

IF EXISTS (SELECT * 
      FROM INFORMATION_SCHEMA.COLUMNS 
      WHERE TABLE_NAME = 'Table1' AND COLUMN_NAME = 'Age') 
begin 
    Print 'in' 
    exec sp_execute_sql N'Update Table1 set Age = Null'; 
End; 
+0

Великие мысли думают одинаково;) – MWillemse

+0

Спасибо, что вы работаете. Могу ли я узнать, что такое sp_execute_sql? – Happy

+0

@Happy. , , Это улучшенная версия команды 'exec'. –

0

После выполнения SQL-сервер пытается компилировать хранимую процедуру и не в состоянии сделать это. Применение немного динамического sql решит вашу проблему:

IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'Table1' AND COLUMN_NAME = 'Age') 
begin 
    Print 'in' 
    EXEC sp_executesql 'Update Table1 set Age = Null' 
End 
Смежные вопросы