До сих пор я использовал формат ниже для создания/обновления таблиц
IF EXISTS (SELECT 1 FROM sysobjects WHERE name = 'table_name' AND type = 'U')
DROP TABLE [dbo].[table_name]
GO
CREATE TABLE [dbo].[table_name]()
GO
Но недавно я столкнулся со случаем, когда в двух схемах есть таблица с одинаковым именем. Как я могу проверить, существует ли таблица в определенной схеме? Это только часть SELECT 1 FROM sysobjects WHERE name = 'table_name' AND type = 'U', которая нуждается в исправлении, остальное я изменил на:
IF EXISTS (SELECT 1 FROM sysobjects WHERE name = 'table_name' AND type = 'U')
DROP TABLE [schema_name].[table_name]
GO
CREATE TABLE [schema_name].[table_name]()
GO
Моя текущая версия сервера — 2008R2, поэтому я бы предпочел ответы, которые также работают для этой версии. У меня многие другие проверки выполняются таким образом, поэтому я не очень хочу полностью менять этот шаблон.





Используйте этот синтаксис.
DROP TABLE IF EXISTS [schema_name].[table_name]
Обратите внимание, что DROP...IF EXISTS требует SQL Server 2016 или более поздней версии.
ПЫТАТЬСЯ
IF OBJECT_ID('[schema_name].[table_name]') IS NOT NULL
DROP TABLE [schema_name].[table_name]
GO
Вы также можете использовать объект schemas. Например:
IF EXISTS (SELECT 1
FROM sys.tables t
JOIN sys.schemas s ON t.schema_id = s.schema_id
WHERE s.[name] = N'schema_name'
AND t.name = N'table_name'
AND t.type = 'U')
DROP TABLE [schema_name].[table_name];
GO
@nickzoum лично я предлагаю ответ OBJECT_ID от С.Хосе. Это гораздо лаконичнее.
Каждая вторая проверка выполняется таким образом. Полностью менять шаблон не хочется. Я также заметил переменную u_id в sysobjects. Разве это не то же самое, что schema_id в sys.tables?
Справедливо. Возможно, это стоит сделать в будущем, если вы хотите сделать его более кратким, хотя :)
Рассмотрите возможность использования более краткой функции
OBJECT_ID:IF OBJECT_ID(N'[schema_name].[table_name]') IS NOT NULL....