Следующий запрос использует ту же идею, что и в этом удивительном ответ по ypercube :
SELECT x.*
FROM (SELECT NULL AS SomeCol) AS dummy
CROSS APPLY
(
SELECT
ID,
SomeCol AS MyTest
FROM dbo.Customers
) AS x;
Это работает так:
если dbo.Customersимеет столбец с именем SomeCol, то SomeColв SomeCol AS MyTestбудет разрешен как dbo.Customers.SomeCol;
если в таблице нет такого столбца, ссылка все равно будет действительной, поскольку теперь она будет разрешена как dummy.SomeCol: на dummyстолбцы можно ссылаться в этом контексте.
Вы можете указать несколько «запасных» столбцов таким образом. Хитрость заключается не в том, чтобы использовать псевдоним таблицы для таких столбцов (что является неодобрительной практикой в большинстве ситуаций, но в этом случае исключение псевдонима таблицы помогает решить проблему).
Если таблица используется в объединении, а другая таблица имеет свою собственную SomeCol, вам, вероятно, потребуется использовать вышеуказанный запрос в качестве производной таблицы, прежде чем использовать его в объединении, чтобы сохранить трюк, что-то вроде этого:
SELECT ...
FROM
(
SELECT x.*
FROM (SELECT NULL AS SomeCol) AS dummy
CROSS APPLY (
SELECT
ID,
SomeCol AS MyTest
FROM dbo.Customers
) AS x
) AS cust
INNER JOIN ...
;