Ако се опитам да изпълня следния код, получавам грешките
Msg 207, ниво 16, състояние 1, ред 3 Невалидно име на колона „Друго“. Msg 207, ниво 16, състояние 1, ред 4 Невалидно име на колона „Друго“.
въпреки че предикатът и за двата израза IF
винаги се оценява като false.
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 винаги трябва да бъде добре оформен (т.е. да отговаря на граматиката) - дори в рамките на блок, който никога не се изпълнява - но съм изумен, че също съм принуден да го направя семантично правилен!
РЕДАКТИРАНЕ: Въпреки че не съм сигурен, че кодът по-долу добавя много към кода по-горе, това е още един пример за проблема. В този сценарий искам само да задам стойността на Definitely (която определено съществува като колона) със стойността от Maybe (която може би съществува като колона), ако Maybe съществува.
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