Подтвердить что ты не робот

Почему OBJECT_ID используется при проверке наличия таблицы или нет

Мне нужно проверить, существует ли таблица в sql.

Если нет, он должен создать его автоматически.

Теперь я исследовал и нашел это кодирование:

IF  NOT EXISTS (SELECT * FROM sys.objects 
WHERE object_id = OBJECT_ID(N'[dbo].[YourTable]') AND type in (N'U'))

BEGIN
CREATE TABLE [dbo].[YourTable](
....
....
....
) 

END

Может ли кто-нибудь объяснить, почему он говорит, где object_id = OBJECT_ID и что я должен поставить вместо него?

4b9b3361

Ответ 1

Мне нравится этот синтаксис:

if(object_id(N'[dbo].[YourTable]', 'U') is not null)
...

Если object_id принимает второй тип объекта char в качестве второго параметра. Вы можете найти список типов объектов, перечисленных ниже в документации sys.objects:

  • AF = Агрегатная функция (CLR)
  • C = ограничение CHECK
  • D = DEFAULT (ограничение или автономное)
  • F = ограничение FOREIGN KEY
  • FN = скалярная функция SQL
  • Скалярная функция FS = Assembly (CLR)
  • Функция таблицы FT = Assembly (CLR)
  • IF = встроенная табличная функция SQL
  • IT = Внутренняя таблица
  • P = Сохраненная процедура SQL
  • Сохраненная процедура PC = Assembly (CLR)
  • PG = Руководство по планированию
  • PK = ограничение PRIMARY KEY
  • R = правило (старое, автономное)
  • RF = процедура репликации-фильтра
  • S = Таблица базовых систем
  • SN = Синоним
  • SO = Объект последовательности
  • SQ = очередь обслуживания
  • TA = Сборка (CLR) DML триггер
  • TF = SQL-табличная функция
  • TR = запуск SQL DML
  • TT = Тип таблицы
  • U = Таблица (определяемая пользователем)
  • UQ = ограничение UNIQUE
  • V = Просмотр
  • X = Расширенная хранимая процедура

Ответ 2

Метод SQL SQL для проверки существования объекта уровня таблицы - это представление INFORMATION_SCHEMA.TABLES

Нет ничего плохого в том, чтобы смотреть на sys.objects, но.... INFORMATION_SCHEMA.TABLES немного более декларативно - и это перекрестная платформа (которая часто не имеет значения, но все же приятна.)

Я думаю, что это, вероятно, более читаемо для нового кодера:

DECLARE @tableName SYSNAME = 'tbfoo'
DECLARE @schemaNAme SYSNAME = 'fooSchema'

IF EXISTS ( SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @tableName AND TABLE_SCHEMA = @schemaName )
BEGIN
    RAISERROR('%s exists in schema: %s', 0, 1, @tableName, @schemaName)
END
ELSE
BEGIN
    RAISERROR('%s DOES NOT EXIST in schema: %s', 0, 1, @tableName, @schemaName)
END

Не беспокойтесь о команде RAISERROR - это просто хороший способ печати отформатированных сообщений.

Вы можете запросить представление INFORMATION_SCHEMA, чтобы понять, что в нем.

SELECT TOP 5 * FROM INFORMATION_SCHEMA.TABLES

Как вы можете видеть - вы можете ссылаться на схемы и каталоги по имени, а не искать свой идентификатор с помощью OBJECT_ID()

Ответ 3

OBJECT_ID() - это функция, которая возвращает идентификатор объекта. См. Документацию:

Возвращает идентификационный номер объекта базы данных схемы объект.

http://msdn.microsoft.com/en-us/library/ms190328.aspx


Передавая ему определенные параметры (т.е. данные вашей таблицы), он вернет идентификатор. Затем вы можете сравнить это с идентификаторами в таблице sys.objects, чтобы проверить, существует ли он в настоящее время.

Ответ 4

object_id = OBJECT_ID(N'[dbo].[YourTable]')

object_id - это имя столбца в sys.objects

object_id - это функция, которая возвращает ID для объекта, который вы указываете, т.е. YourTable.

Вы сравниваете object_id YourTable с столбцом object_id в таблице sys.objects. Вам нужно заменить YourTable на то, что имя таблицы, которое вы хотите проверить, уже существует.