T-SQL Проверьте, существует ли таблица в схеме

До сих пор я использовал формат ниже для создания/обновления таблиц

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, поэтому я бы предпочел ответы, которые также работают для этой версии. У меня многие другие проверки выполняются таким образом, поэтому я не очень хочу полностью менять этот шаблон.

Рассмотрите возможность использования более краткой функции OBJECT_ID: IF OBJECT_ID(N'[schema_name].[table_name]') IS NOT NULL....

Dan Guzman 08.02.2019 12:16
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
6 353
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Используйте этот синтаксис.

DROP TABLE IF EXISTS [schema_name].[table_name]

Обратите внимание, что DROP...IF EXISTS требует SQL Server 2016 или более поздней версии.

Dan Guzman 08.02.2019 12:18

ПЫТАТЬСЯ

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 от С.Хосе. Это гораздо лаконичнее.

Larnu 08.02.2019 12:23

Каждая вторая проверка выполняется таким образом. Полностью менять шаблон не хочется. Я также заметил переменную u_id в sysobjects. Разве это не то же самое, что schema_id в sys.tables?

nick zoum 08.02.2019 12:25

Справедливо. Возможно, это стоит сделать в будущем, если вы хотите сделать его более кратким, хотя :)

Larnu 08.02.2019 12:25

Другие вопросы по теме