Можете да използвате OBJECTPROPERTY()
функция в SQL Server, за да провери дали даден обект е дефинирана от потребителя таблица или не.
За да направите това, предайте идентификатора на обекта като първи аргумент и IsUserTable
като втори аргумент. Функцията връща 1
или 0
в зависимост от това дали е дефинирана от потребителя таблица.
Връщана стойност на 1
означава, че е дефинирана от потребителя таблица и стойност 0
означава, че не е.
Пример 1 – Основна употреба
Ето един бърз пример за демонстрация.
ИЗПОЛЗВАЙТЕ WideWorldImportersDW;ИЗБЕРЕТЕ OBJECTPROPERTY(1013578649, 'IsUserTable') КАТО [IsUserTable];
Резултат:
+---------------+| IsUserTable ||--------------|| 1 |+--------------+
В този случай WideWorldImportersDW базата данни има обект с предоставения идентификатор и е дефинирана от потребителя таблица.
Пример 2 – Получаване на идентификатора на обекта
Ако знаете името на обекта, но не и неговия идентификатор, можете да използвате OBJECT_ID()
функция за извличане на идентификатора въз основа на неговото име.
Пример:
ИЗБЕРЕТЕ OBJECTPROPERTY(OBJECT_ID('Dimension.City'), 'IsUserTable') КАТО [IsUserTable];
Резултат:
+---------------+| IsUserTable ||--------------|| 1 |+--------------+
Това е същият обект от предишния пример.
Ето го отново с отделно извеждане на ID.
ИЗБЕРЕТЕ OBJECT_ID('Dimension.City') КАТО [ИД на обект], OBJECTPROPERTY(OBJECT_ID('Dimension.City'), 'IsUserTable') КАТО [IsUserTable];
Резултат:
+------------+--------------+| Идентификатор на обект | IsUserTable ||------------+--------------|| 1013578649 | 1 |+------------+--------------+
Пример 3 – Когато обектът НЕ е таблица, дефинирана от потребителя
Ето какво се случва, когато обектът не е потребителска таблица.
ИЗБЕРЕТЕ OBJECTPROPERTY(402100473, 'IsUserTable') КАТО [IsUserTable];
Резултат:
+---------------+| IsUserTable ||--------------|| 0 |+--------------+
В този случай базата данни прави имам обект с този идентификатор, но обектът всъщност е съхранена процедура (а не таблица, дефинирана от потребителя), така че получавам отрицателен резултат.
Тук отново се използва OBJECT_ID()
.
ИЗБЕРЕТЕ OBJECT_ID('Sequences.ReseedAllSequences') КАТО [ID на обект], OBJECTPROPERTY(OBJECT_ID('Sequences.ReseedAllSequences'), 'IsUserTable') КАТО [IsUserTable], OBJECTPROPERTY('SeeedAllSequences'Sequences.Sequencell), IsProcedure') AS [IsProcedure];
Резултат:
+------------+--------------+--------------+ | Идентификатор на обект | IsUserTable | IsProcedure ||------------+--------------+---------------|| 402100473 | 0 | 1 |+------------+--------------+--------------+предварително>Проверих също дали обектът е съхранена процедура и резултатът е положителен.
Пример 4 – Обектът не съществува
SQL Server приема, че идентификаторът на обекта е в текущия контекст на базата данни. Ако подадете идентификатор на обект от друга база данни, или ще получите резултат NULL, или ще получите неправилни резултати.
ИЗБЕРЕТЕ OBJECTPROPERTY(OBJECT_ID('InvalidObject'), 'IsUserTable') КАТО [InvalidObject], OBJECTPROPERTY(12345678, 'IsUserTable') КАТО [12345678];Резултат:
+-----------------+-----------+| Невалиден обект | 12345678 ||----------------+------------|| NULL | NULL |+-----------------+-----------+В този случай базата данни не съдържа обекти с това име или ID и така получавам резултат NULL.
Също така ще получите NULL при грешка или ако нямате разрешение да видите обекта.