Почему 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
и что я должен поставить вместо него?
Ответы
Ответ 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
на то, что имя таблицы, которое вы хотите проверить, уже существует.