Если я пытаюсь выполнить следующий код, я получаю ошибки
Сообщение 207, Уровень 16, Состояние 1, Строка 3 Недопустимое имя столбца «Другой».Сообщение 207, уровень 16, состояние 1, строка 4 Неверное имя столбца «Другой».
, хотя предикат для обоих операторов IF
всегда оценивается как ложный.
CREATE TABLE #Foo (Bar INT)
GO
IF (1=0)
BEGIN
SELECT Another FROM #Foo
END
GO
IF (1=0)
BEGIN
ALTER TABLE #Foo ADD Another INT
SELECT Another FROM #Foo
END
GO
DROP TABLE #Foo
Это, вероятно, слишком упрощено ради примера;на самом деле мне нужно выбрать значения из столбца, но только если столбец существует.Если его не существует, мне все равно.В задаче, которая заставила меня задать этот вопрос, мой предикат соответствовал EXISTS (SELECT * FROM sys.columns WHERE object_id = @ID AND name = @Name)
.Есть ли способ достичь этого, не прибегая к моему заклятому врагу Dynamic SQL?Я понимаю, что мой SQL всегда должен быть правильно сформирован (то есть соответствовать грамматике) - даже в пределах блока, который никогда не выполняется - но я поражен тем, что я также вынужден сделать его семантически правильным!
РЕДАКТИРОВАТЬ: Хотя я не уверен, что приведенный ниже код добавляет много к коду выше, это еще один пример проблемы.В этом сценарии я только хочу установить значение Определенно (которое определенно существует в виде столбца) со значением Возможно (которое может существовать в виде столбца), если Возможно существует.
IF EXISTS (SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('dbo.TableName', 'U') AND name = 'Maybe')
BEGIN
UPDATE dbo.TableName SET Definitely = Maybe
END