Следующий запрос использует ту же идею, что и в этом удивительном ответ по 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 ...
;