Используйте оператор CASE для проверки наличия столбца в таблице - SQL Server
Я использую оператор SQL server, встроенный в некоторый другой код С#; и просто хотите проверить, существует ли столбец в моей таблице.
Если столбец (ModifiedByUSer
здесь) существует, я хочу вернуть 1 или true; если это не так, я хочу вернуть 0 или false (или что-то подобное, которое можно интерпретировать на С#).
Я использую оператор CASE, например:
SELECT cast(case WHEN EXISTS (select ModifiedByUser from Tags)
THEN 0
ELSE 1
END as bit)
Но если ModifiedByUser не существует, я получаю invalid column name
вместо возвращаемого значения.
Я также рассмотрел:
IF EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Tags' AND COLUMN_NAME = 'ModifiedByUser')
BEGIN // Do something here to return a value
END
Но не знаю, как условно вернуть значение/bool/бит на основе результата.
Любая помощь очень ценится!
Ответы
Ответ 1
Окончательный ответ был комбинацией двух из вышеперечисленных (я поддержал оба, чтобы выразить свою признательность!):
select case
when exists (
SELECT 1
FROM Sys.columns c
WHERE c.[object_id] = OBJECT_ID('dbo.Tags')
AND c.name = 'ModifiedByUserId'
)
then 1
else 0
end
Ответ 2
select case
when exists (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Tags' AND COLUMN_NAME = 'ModifiedByUser')
then 0
else 1
end
Ответ 3
SELECT *
FROM ...
WHERE EXISTS(SELECT 1
FROM sys.columns c
WHERE c.[object_id] = OBJECT_ID('dbo.Tags')
AND c.name = 'ModifiedByUser'
)
Ответ 4
Попробуйте этот вариант -
SELECT *
FROM ...
WHERE EXISTS(SELECT 1
FROM sys.columns c
WHERE c.[object_id] = OBJECT_ID('dbo.Tags')
AND c.name = 'ModifiedByUser'
)
Ответ 5
Вы можете проверить таблицу "сопоставление столбцов таблицы"
SELECT count(*)
FROM Sys.Columns c
JOIN Sys.Tables t ON c.Object_Id = t.Object_Id
WHERE upper(t.Name) = 'TAGS'
AND upper(c.NAME) = 'MODIFIEDBYUSER'