2013-11-22 5 views
3
IF ((SELECT count(name) FROM syscolumns WHERE name = 'foobar') > 0) 
BEGIN 
     SELECT 'exists' 
    --, foobar FROM baz -- <--rename this to a table that exists 
END 
ELSE 
SELECT 'boo' 

IF (exists(SELECT name FROM syscolumns WHERE name = 'foobar')) 
BEGIN 
    SELECT 'exists' 
    --, foobar FROM baz -- <--rename this to a table that exists 
END 
ELSE 
    SELECT 'boo' 

Оба эти утверждения должны вызывать для вас «boo» (выполнить их против любого db).Тестирование столбца, потерявшего мой разум

Раскомментирует второй ВЫБРАТЬ значение в каждом запросе (Foobar) ...

Насколько я могу судить, @!% $ ING двигатель вычисляет выражения БУДЬ ОНИ HIT ИЛИ НЕ !!! НИКОГДА НЕ УМЕНЬШИТЕ ЛОГИКУ!

Я высокий? Смущенный? Глупый?

Извините за все шапки, просто очень расстроены этим.

ответ

1

Я не могу понять, в чем проблема. Если двигатель БД говорит вам:

Msg 207, Level 16, State 1, Line 4 
Invalid column name 'foobar'. 
Msg 207, Level 16, State 1, Line 12 
Invalid column name 'foobar'. 

то это ожидаемое поведение. Слышали о ошибках времени выполнения/компиляции?

Попробуйте изменить колонку на то, что существует, и она будет работать нормально. Проблема в том, что логика заключается в том, что этот кодовый блок никогда не будет выполняться, но при компиляции SQL механизм БД оценивает и определяет, что столбец не существует. Отсюда и ошибка.

+0

Я озадаченный, хотя - логика работает, как и следовало ожидать, пока я не включать полевые испытания в BEGIN/END блок пути Истины ... а потом barfs рассказывал мне колонку Безразлично» t существует. Я бы ожидал, что если столбец не существует, он не оценит эту часть в первую очередь. – dreynold

+1

Попробуйте изменить колонку на то, что существует, и она будет работать нормально. Проблема в том, что логика заключается в том, что этот кодовый блок никогда не будет выполняться, но при компиляции SQL механизм БД оценивает и определяет, что столбец не существует. Отсюда и ошибка. – Raj

+0

Ahhh - Это объясняет ... Похоже, мне нужно вывести логику из моего динамического SQL и в другой кусок исполнения. Благодаря! – dreynold

0

После 10 минут разочарования я наконец получил его. Хотя я не уверен на 100%, позволяется ли вам указать ип существующих столбцов, есть возможные обходные пути, такие как:

IF ((SELECT count(name) FROM syscolumns WHERE name= 'foobar') > 0) 
    BEGIN 
    DECLARE @sql NVARCHAR(MAX); 
    SET @sql = N' SELECT foobar FROM #temp1 -- <--rename this to a table that exists;'; 
    EXEC sp_executesql @sql; 
    END 
    ELSE 
    SELECT 'boo' 
+0

Уххх ... Это как раз то, что нужно. Кажется, что оценивает оператор select и barf, даже если логика диктует, что этот раздел не будет выполнен. – dreynold

1

Что об использовании EXEC?

И COL_LENGTH, чтобы найти существование столбца, так как это намного лучший способ, чем проверка системных столбцов ИМО.

IF COL_LENGTH('foobar','foo') IS NOT NULL 
BEGIN 


     EXEC ('SELECT ''exists'' 
    , foo FROM foobar') -- <--rename this to a table that exists 
END 
ELSE 
SELECT 'boo' 
+0

Я изучу это - спасибо! Вышеприведенный пример - всего лишь голой проблемы с некоторым динамическим SQL, с которым я избивал свой череп. – dreynold

Смежные вопросы