Если существует, ведет себя по-разному в зависимости от отсутствия столбца или таблицы - PullRequest
2 голосов
/ 19 сентября 2019

Я пытаюсь понять, почему этот код, по моему мнению, ведет себя непоследовательно.У меня есть простое предложение, если существует, которое проверяет, присутствует ли столбец в таблице или нет.

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'COL' and TABLE_NAME = 'TAB')
BEGIN
    PRINT 'EXISTS'
    SELECT COL FROM TAB
END
ELSE
BEGIN
    PRINT 'NOT EXISTS'
END

Это выполняется просто отлично, если таблица TAB имеет столбец COL.Если столбец COL удаляется из TAB, оператор не может быть выполнен, указав недопустимый столбец.Все идет нормально.Затем, если я полностью урону таблицу TAB, оператор выполнится просто отлично и выведет «NOT EXISTS».Я проверил это дальше, и кажется, что пока таблица не существует, и если EXISTS оценивается как ложное, вы можете написать все, что хотите, например:

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE 1=0)
BEGIN
    PRINT 'EXISTS'
    SELECT THISISMYFANTASYCOLUMN FROM FANTASYTABLE
END
ELSE
BEGIN
    PRINT 'NOT EXISTS'
END

Этот оператор всегда печатает «НЕ СУЩЕСТВУЕТ»и sqlserver не жалуется.

РЕДАКТИРОВАТЬ: чтобы отличить от возможного дублирования вопроса.Я не ищу решение этой проблемы, которая заключается в использовании динамического SQL.Вопрос в том, почему существующая таблица + недопустимое имя столбца вызывает ошибку, но несуществующая таблица с несуществующим столбцом является допустимой.Пример Seans иллюстрирует другое поведение более четко, чем исходная публикация.

1 Ответ

2 голосов
/ 19 сентября 2019

Это на самом деле не ответ, а более простой пример демонстрации поведения.Оператор EXISTS добавляет слой сложности, который сбивает людей с толку.

При выполнении следующего кода вы увидите, что PRINT выполняется.Это для несуществующей таблицы.

PRINT 'EXISTS'
SELECT name FROM sys.databasesasdf

Однако, если вы ссылаетесь на столбец, который не существует в существующей таблице, PRINT не выполняется.

PRINT 'EXISTS'
SELECT asdf FROM sys.databases
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...