В SQL Server можете да използвате OBJECT_ID()
функция за връщане на идентификатора на обект въз основа на неговото име.
Това може да бъде полезно, когато имате нужда от идентификатор на обект, но знаете само името му.
Официалната дефиниция на OBJECT_ID()
е, че връща идентификационния номер на обект от база данни на обект с обхват на схема
.
Пример 1 – Основна употреба
Ето основен пример, за да демонстрирате как работи.
ИЗБЕРЕТЕ OBJECT_ID('Изпълнители') КАТО резултат;
Резултат:
+-----------+| Резултат ||-----------|| 885578193 |+----------+
В този случай текущата база данни съдържа обект, наречен Albums
, а неговият идентификационен номер е 885578193. Това е идентификаторът, който можете да намерите в object_id
колона на sys.objects
изглед на системния каталог.
Пример 2 – Проверете изгледа sys.objects
Ето още един основен пример, за да потвърдите това, което казах току-що.
ИЗБЕРЕТЕ име, object_id, OBJECT_ID(име) КАТО [OBJECT_ID(име)]FROM sys.objectsWHERE name ='Художници';
Резултат:
+--------+------------+------------------+| име | обект_идентификатор | OBJECT_ID(име) ||---------+------------+------------------| | Художници | 885578193 | 885578193 |+--------+------------+-------------------+
sys.objects
Изгледът на системния каталог съдържа ред за всеки дефиниран от потребителя обект с обхват на схема, който е създаден в база данни.
В този пример първите две колони показват name
на обекта и object_id
съответно.
В третата колона на този пример използвам OBJECT_ID()
да върне идентификатора на обекта въз основа на неговото име. За да направя това, предавам колоната с име на OBJECT_ID()
функция.
Това очевидно е само пример и използва OBJECT_ID()
беше ненужно в този случай, тъй като sys.objects
вече връща идентификатора на обекта.
Пример 3 – По-полезен пример
В този пример използвам OBJECT_ID()
в WHERE
клауза, така че да получавам само резултати, свързани с таблицата, наречена Client
.
ИЗБЕРЕТЕ OBJECT_NAME(referencing_id) КАТО [Референтен обект], OBJECT_NAME(referencing_minor_id) КАТО [Референтен второстепенен обект], referencing_class_desc КАТО [Клас], COL_NAME(referenced_id, referenced_minor_id) КАТО [ColumnssHERMOR_MINOR_ID) AS [ColumnyssqtJEFEND_Reference_ColumnyssqEF_ROM Клиент“);
Резултат:
+---------------------+----------------------- -----+----------------+------------+| Референтен субект | Референтно второстепенно образувание | Клас | Колона ||---------------------+----------------------- ----+------------------+------------|| uspGetClient | NULL | OBJECT_OR_COLUMN | NULL || uspGetOrdersByClient | NULL | OBJECT_OR_COLUMN | NULL || chkClientCode | NULL | OBJECT_OR_COLUMN | Клиентски код |+---------------------+----------------------- ----+-----------------+-----------+
В този случай исках да видя кои обекти зависят от Client
таблица (т.е. кои обекти се позовават на тази таблица в своя SQL код). referenced_id
колоната използва идентификатора на обекта, така че с помощта на OBJECT_ID()
, успях да получа идентификатора на Client
таблица и я сравнете с referenced_id
.
Вижте Намиране на зависимости в SQL Server:sql_expression_dependencies за по-подробно обяснение на тази заявка и свързани примери.
Пример 4 – Напълно квалифицирани имена
Освен това имате възможност да квалифицирате името на обекта с името на схемата, както и името на базата данни, ако желаете.
Ето един прост пример за демонстрация:
SELECT OBJECT_ID('Artists') AS [1 Part Name], OBJECT_ID('dbo.Artists') AS [2 Part Name], OBJECT_ID('Music.dbo.Artists') AS [3 Part Name];предварително>Резултат:
+--------------+--------------+-------------- -+| 1 Име на част | 2 Име на част | 3 Име на част ||--------------+--------------+------------ --|| 885578193 | 885578193 | 885578193 |+--------------+--------------+-------------- +Ето го отново, този път с квадратни скоби като разделители:
ИЗБЕРЕТЕ OBJECT_ID('[Изпълнители]') КАТО [1 име на част], OBJECT_ID('[dbo].[Изпълнители]') КАТО [Име на 2 част], OBJECT_ID('[Музика].[dbo].[ Изпълнители]') AS [3 Part Name];Резултат:
+--------------+--------------+-------------- -+| 1 Име на част | 2 Име на част | 3 Име на част ||--------------+--------------+------------ --|| 885578193 | 885578193 | 885578193 |+--------------+--------------+-------------- +Същият резултат.
Ако някога получите резултат NULL, въпреки че знаете, че обектът съществува, опитайте да го квалифицирате със схемата (и дори името на базата данни).
Пример 5 – Кръстосани заявки за база данни
По подразбиране SQL Server приема, че името на обекта е в контекста на текущата база данни. Можете да използвате име от 3 части, за да посочите обект в различна база данни.
Ето същия код от предишния пример, с изключение на този път, когато стартирам кода два пъти:първия път, когато се стартира в
Music
база данни, втория път се изпълнява вWideWorldImportersDW
база данни:ИЗПОЛЗВАЙТЕ Музика;ИЗБЕРЕТЕ OBJECT_ID('Изпълнители') КАТО [1 име на част], OBJECT_ID('dbo.Artists') КАТО [Име на 2 части], OBJECT_ID('Music.dbo.Artists') КАТО [3 име на част ];ИЗПОЛЗВАЙТЕ WideWorldImportersDW;ИЗБЕРЕТЕ OBJECT_ID('Артисти') КАТО [Име на 1 част], OBJECT_ID('dbo.Artists') КАТО [Име на 2 части], OBJECT_ID('Music.dbo.Artist') КАТО [Име на 3 части];Резултат:
Променен контекстът на базата данни на „Музика“.+--------------+--------------+------ ---------+| 1 Име на част | 2 Име на част | 3 Име на част ||--------------+--------------+------------ --|| 885578193 | 885578193 | 885578193 |+--------------+--------------+-------------- +(1 ред засегнат) Променен контекстът на базата данни на „WideWorldImportersDW“.+--------------+--------------+--- ------------+| 1 Име на част | 2 Име на част | 3 Име на част ||--------------+--------------+------------ --|| NULL | NULL | 885578193 |+--------------+--------------+-------------- +(1 ред засегнат)В първия резултат и трите колони връщат правилния идентификатор. Това е така, защото обектът се намира в
Music
база данни.Във втория резултат само името на 3 части може да намери правилния обект. Това може да се очаква, тъй като имената на 1 част и 2 части не посочват името на базата данни, следователно се предполага, че обектът е в
WideWorldImportersDW
(грешна) база данни.Пример 6 – Посочете типа на обекта
OBJECT_ID()
функцията приема и аргумент за типа обект. Този аргумент, ако е предоставен, идва след името на обекта.Пример:
ИЗБЕРЕТЕ OBJECT_ID('Изпълнители', 'U') КАТО [Таблица];Резултат:
+-----------+| Таблица ||-----------|| 885578193 |+----------+Тук уточнявам, че типът на обекта е
U
, което означава „Таблица (дефинирана от потребителя)“.Ако се опитам да посоча различен тип обект, получавам
NULL
:SELECT OBJECT_ID('Художници', 'U') КАТО [Таблица], OBJECT_ID('Художници', 'V') КАТО [Изглед], OBJECT_ID('Артисти', 'P') КАТО [Съхранена процедура];Резултат:
+-----------+-------+--------------------------+| Таблица | Преглед | Съхранена процедура ||-----------+--------+--------------------|| 885578193 | NULL | NULL |+-----------+-------+-------------------+Ето го отново, но вместо това с името на изглед:
SELECT OBJECT_ID('RockAlbums', 'U') КАТО [Таблица], OBJECT_ID('RockAlbums', 'V') КАТО [Преглед], OBJECT_ID('RockAlbums', 'P') КАТО [Съхранена процедура];Резултат:
+--------+------------+-------------------+| Таблица | Преглед | Съхранена процедура ||---------+------------+--------------------|| NULL | 1525580473 | NULL |+--------+------------+--------------------+