Когато използвате SQL Server, ако някога се окажете на път да направите присъединяване към sys.objects
изглед на системния каталог, за да получите името на обект, може би спрете и първо прочетете това.
Transact-SQL има вградена функция, наречена OBJECT_NAME()
който връща името на обект въз основа на неговия идентификатор.
С други думи, ако имате идентификатора на обекта (например object_id
колона), можете просто да предадете този идентификатор на OBJECT_NAME()
функция и тя ще върне името на обекта вместо вас – не се изисква присъединяване!
Пример 1 – Основна употреба
Ето основен пример, за да демонстрирате как работи.
ИЗБЕРЕТЕ име, object_id, OBJECT_NAME(object_id) КАТО [OBJECT_NAME(object_id)]FROM sys.objectsWHERE name ='Художници';
Резултат:
+--------+------------+--------------------- ----+| име | обект_идентификатор | OBJECT_NAME(object_id) ||---------+------------+------------------- ------|| Художници | 885578193 | Художници |+--------+------------+----------------------- ---+
Тук можем да видим, че първите две колони показват съответно името и идентификатора на обекта. Третата колона използва OBJECT_NAME()
функция за връщане на името от идентификатора.
Това очевидно е само пример, но в този случай се използва OBJECT_NAME()
беше ненужно, тъй като sys.objects
вече връща името на обекта.
Следващият пример показва къде OBJECT_NAME()
може да бъде полезен.
Пример 2 – По-полезен пример
В този пример връщам информация за външен ключ чрез заявка за sys.foreign_keys
изглед на системен каталог.
Първо, нека изберем всички колони, за да видим какво се връща от този изглед:
ИЗПОЛЗВАЙТЕ музика;ИЗБЕРЕТЕ * ОТ sys.foreign_keysWHERE name ='FK_Arrtists_Country';
Резултат (с помощта на вертикален изход):
<предварително име | FK_Artists_Countryobject_id | 1253579504principal_id | NULLschema_id | 1 идентификатор_на_родител_обект | 885578193тип | F type_desc | FOREIGN_KEY_CONSTRAINT дата_създаване | 2019-08-27 16:14:39.560modify_date | 2019-08-28 03:28:07.040is_ms_shipped | 0е_публикувано | 0is_schema_published | 0referenced_object_id | 1205579333key_index_id | 1 е_забранено | 0е_не_за_репликация | 0 не е_доверено | 0delete_referential_action | 0delete_referential_action_desc | NO_ACTIONupdate_referential_action | 0update_referential_action_desc | NO_ACTION е_именувана на_системата | 0
Този изглед връща името на външния ключ, но не и името на неговия родителски обект. Нито връща името на обекта на външния ключ. Той връща само идентификатора на тези обекти (а именно parent_object_id
и referenced_object_id
).
Така че, ако трябва да го ограничим само до тези колони, ще получим нещо подобно:
ИЗПОЛЗВАЙТЕ музика;ИЗБЕРЕТЕ име, parent_object_id, referenced_object_idFROM sys.foreign_keysWHERE name ='FK_Artists_Country';
Резултат:
+--------------------+--------------------+---- --------------------+| име | идентификатор_на_обект_родител | идентификатор_на_обекта ||--------------------+--------------------+----- -------------------|| FK_Артисти_Държава | 885578193 | 1205579333 |+-------------------+-------------------+----- -------------------+
За щастие можем да предадем последните две колони на OBJECT_NAME()
за да извлечете имената на обектите.
Ето какво можем да направим, за да върнем имената.
ИЗПОЛЗВАЙТЕ музика;ИЗБЕРЕТЕ име КАТО [Външен ключ], OBJECT_NAME(parent_object_id) КАТО [Име на родителски обект], OBJECT_NAME(referenced_object_id) КАТО [Име на препоръчан обект]FROM sys.foreign_keysWHERE name ='FK_Arrtists_Country';
Резултат:
+--------------------+---------------------+-- ------------------------+| Външен ключ | Име на родителски обект | Име на препоръчан обект ||--------------------+---------------------+- -------------------------|| FK_Артисти_Държава | Художници | Държава |+--------------------+---------------------+--- -----------------------+
За последните две колони предавам съответните стойности на OBJECT_NAME()
функция, така че да връща името на всеки родителски обект.
Пример 3 – Използване на OBJECT_NAME() в клауза WHERE
Ето пример за използване на OBJECT_NAME()
в WHERE
клауза.
ИЗБЕРЕТЕ име, object_id, type_desc FROM sys.objects WHERE име =OBJECT_NAME(1253579504);
Резултат:
+--------------------+------------+----------- ------------+| име | обект_идентификатор | type_desc ||--------------------+------------+------------ ------------|| FK_Артисти_Държава | 1253579504 | FOREIGN_KEY_CONSTRAINT |+--------------------+------------+----------- ------------+
Кръстосани заявки за база данни
По подразбиране SQL Server приема, че идентификаторът на обекта е в контекста на текущата база данни. Заявка, която препраща към идентификатор в друга база данни, връща NULL или неправилни резултати.
Ако трябва да намерите име на обект от друга база данни, можете да предоставите идентификатора на тази база данни като втори аргумент при извикване на OBJECT_NAME()
.
Вижте как да получите OBJECT_NAME() от различна база данни в SQL Server за примери.