Если я попытаюсь выполнить следующий код, я получу ошибки
Сообщение 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