** отредактировано для инвертирования логики в тесте EXISTS
Мне нужно выбрать поле из таблицы, которая может не существовать.Мне также нужно сделать это в подзапросе.
Существует инженерный релиз кода, который добавит таблицу в базу данных, которую я очищаю для отчетов.Если таблица существует, выберите поле.Если это не так, дайте общий сбой.
** Да, есть множество примеров того, как использовать EXISTS.Это выходит за рамки тех, которые имеют дело с чем-то, что может не существовать.
Новая версия кода будет развернута на нескольких сайтах, некоторые могут не иметь таблицы сразу, как другие.Мои материалы должны быть готовы к Day Zero - aka: развернуты заранее (день -1?).
Вот мой код (таблицы и столбцы переименованы), который я пытаюсь заставить работать в SQL Server Management Studio.(SQL 2016) (SSMS 17.4)
select 'Cern' as SiteName,
(
select
case when exists (select 1 from sys.tables where name like 'ProtonAcceleratorSecurity')
then
(select top 1 isnull(SecurityID,'Not on file') from [ProtonAcceleratorSecurity] with (nolock) )
else
(select 'No Security Table Found')
end
as SecurityID
Это выглядит надуманным, но это очень близко к тому, что я пытаюсь сделать, используя этот точный запрос (но никак не связан с безопасностью ...)
Цель состоит в том, чтобы вернуть имя сайта и первый идентификатор безопасности (случайным образом - не имеет значения - согласованность не требуется) - но только если таблица действительно существует.
Проблема заключается в том, чточто SSMS выдает ошибку, сообщающую, что таблица является недопустимым объектом, который я уже знаю.
"Неверное имя объекта 'ProtonAcceleratorSecurity'"
Окончательный ответ от @TabAlleman с незначительной поправкой:
SET @sql = '
select ''Cern'' as SiteName, ' +
( select
case when exists (select 1 from sys.tables where name like 'ProtonAcceleratorSecurity')
then
'(select top 1 isnull(SecurityID,''Not on file'') from [ProtonAcceleratorSecurity] with (nolock) )'
else
'''No Security Table Found'''
end )
+ ' as SecurityID ';
EXEC (@sql); ```