Почему что-то подобное не работает?
SELECT
CASE
WHEN NULLIF(COL_LENGTH('Customers', 'Somecol'), '') IS NULL THEN NULL
ELSE Somecol
END AS MyTest
FROM Customers;
Я просто проверяю, существует ли столбец, однако SQL Server жалуется на то, что он Somecol
не существует. Есть ли альтернатива этому в одном утверждении?
sql-server
t-sql
Карсон Рейнке
источник
источник
CASE
оператор.INFORMATION_SCHEMA
может работать как обходной путь.Ответы:
Следующий запрос использует ту же идею, что и в этом удивительном ответ по ypercube :
Это работает так:
если
dbo.Customers
имеет столбец с именемSomeCol
, тоSomeCol
вSomeCol AS MyTest
будет разрешен какdbo.Customers.SomeCol
;если в таблице нет такого столбца, ссылка все равно будет действительной, поскольку теперь она будет разрешена как
dummy.SomeCol
: наdummy
столбцы можно ссылаться в этом контексте.Вы можете указать несколько «запасных» столбцов таким образом. Хитрость заключается не в том, чтобы использовать псевдоним таблицы для таких столбцов (что является неодобрительной практикой в большинстве ситуаций, но в этом случае исключение псевдонима таблицы помогает решить проблему).
Если таблица используется в объединении, а другая таблица имеет свою собственную
SomeCol
, вам, вероятно, потребуется использовать вышеуказанный запрос в качестве производной таблицы, прежде чем использовать его в объединении, чтобы сохранить трюк, что-то вроде этого:источник
Один из способов сделать это - проверить существование столбцов, а затем построить динамический SQL на основе того, существует этот столбец или нет.
Без динамического SQL SQL Server будет пытаться оценить, существует ли столбец, прежде чем он даже выполнит определение, что приведет к ошибке.
Это, однако, означает, что вам нужно будет написать 2 запроса и, возможно, изменить их в будущем. Но я не верю, что вы должны нацеливаться на
SELECT
утверждения по столбцам, которые могут не существовать.источник
Вы можете использовать некоторые XML для запроса столбцов, которые могут быть в таблице.
Построить XML из всех столбцов в строке в перекрестном применении и извлечь значение с помощью
values()
функции.В этом запросе идентификатор известен, поэтому получите его из таблицы напрямую. Col1 и Col2 могут быть там или нет, чтобы получить их, используя XML.
SQL Fiddle
источник
Мой подход отличается незначительно от других. Я предпочитаю использовать систему для этого и просто получить счетчик, потому что вы можете назначить счетчик столбцов переменной в верхней части запроса и затем выбрать, продолжать или нет, основываясь на этом. Недостатком этого является ... если у вас одинаковое имя столбца в нескольких таблицах, вы не уверены, что столбец существует в таблице, которую вы хотите запросить. Тем не менее, техника работает и на определенных таблицах, так как вы просто хотите получить счет.
«Проблема» в том, чтобы спрашивать об этом конкретно, - проблема, которую вы испытываете. В общем, если значение NULL вызывает проблемы ... найдите другой способ проверить существование. Это один из способов сделать это, не рискуя расстроить сервер.
источник
sysobjects
также в вашем запросе, чтобы проверить, есть ли в конкретной таблице такой столбец?SELECT 1 ...
тоже не ошибка.EXISTS (SELECT ...)
обычно быстрее(SELECT COUNT(*) ...)
, а не наоборот.Если я правильно понял ...
Вы можете использовать запрос, подобный приведенному ниже, и действовать соответствующим образом, основываясь на количестве ... Если счетчик> 1, то это означает, что у вас есть col в этой таблице, а count = 0, тогда у вас нет этого col в этом стол
SELECT count (*)
FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME IN ('Id')
И TABLE_SCHEMA = 'dbo' и TABLE_NAME = 'UserBase';
источник