Pokud při používání SQL Serveru někdy zjistíte, že se chystáte provést spojení s sys.objects
zobrazení systémového katalogu, abyste získali název objektu, možná nejprve přestaňte a přečtěte si toto.
Transact-SQL má vestavěnou funkci s názvem OBJECT_NAME()
který vrací název objektu na základě jeho ID.
Jinými slovy, pokud máte ID objektu (například object_id
sloupec), můžete toto ID jednoduše předat do OBJECT_NAME()
a vrátí vám název objektu – není nutné spojení!
Příklad 1 – Základní použití
Zde je základní příklad, který demonstruje, jak to funguje.
SELECT name, object_id, OBJECT_NAME(object_id) AS [OBJECT_NAME(object_id)] FROM sys.objects WHERE name = 'Artists';
Výsledek:
+---------+-------------+--------------------------+ | name | object_id | OBJECT_NAME(object_id) | |---------+-------------+--------------------------| | Artists | 885578193 | Artists | +---------+-------------+--------------------------+
Zde vidíme, že první dva sloupce zobrazují název a ID objektu. Třetí sloupec používá OBJECT_NAME()
funkci vrátit jméno z ID.
Toto je samozřejmě jen příklad, ale v tomto případě s použitím OBJECT_NAME()
bylo zbytečné, protože sys.objects
již vrací název objektu.
Následující příklad ukazuje, kde OBJECT_NAME()
může se hodit.
Příklad 2 – užitečnější příklad
V tomto příkladu vracím informace o cizím klíči dotazem na sys.foreign_keys
zobrazení systémového katalogu.
Nejprve vyberte všechny sloupce, abyste viděli, co toto zobrazení vrací:
USE Music; SELECT * FROM sys.foreign_keys WHERE name = 'FK_Artists_Country';
Výsledek (při použití vertikálního výstupu):
name | FK_Artists_Country object_id | 1253579504 principal_id | NULL schema_id | 1 parent_object_id | 885578193 type | F type_desc | FOREIGN_KEY_CONSTRAINT create_date | 2019-08-27 16:14:39.560 modify_date | 2019-08-28 03:28:07.040 is_ms_shipped | 0 is_published | 0 is_schema_published | 0 referenced_object_id | 1205579333 key_index_id | 1 is_disabled | 0 is_not_for_replication | 0 is_not_trusted | 0 delete_referential_action | 0 delete_referential_action_desc | NO_ACTION update_referential_action | 0 update_referential_action_desc | NO_ACTION is_system_named | 0
Toto zobrazení vrátí název cizího klíče, ale ne název jeho nadřazeného objektu. Nevrací ani název odkazovaného objektu cizího klíče. Vrátí pouze ID těchto objektů (jmenovitě parent_object_id
a referenced_object_id
).
Takže pokud bychom to zúžili pouze na tyto sloupce, dostali bychom něco takového:
USE Music; SELECT name, parent_object_id, referenced_object_id FROM sys.foreign_keys WHERE name = 'FK_Artists_Country';
Výsledek:
+--------------------+--------------------+------------------------+ | name | parent_object_id | referenced_object_id | |--------------------+--------------------+------------------------| | FK_Artists_Country | 885578193 | 1205579333 | +--------------------+--------------------+------------------------+
Naštěstí můžeme poslední dva sloupce předat OBJECT_NAME()
abyste získali názvy objektů.
Zde je to, co můžeme udělat, abychom jména vrátili.
USE Music; SELECT name AS [Foreign Key], OBJECT_NAME(parent_object_id) AS [Parent Object Name], OBJECT_NAME(referenced_object_id) AS [Referenced Object Name] FROM sys.foreign_keys WHERE name = 'FK_Artists_Country';
Výsledek:
+--------------------+----------------------+--------------------------+ | Foreign Key | Parent Object Name | Referenced Object Name | |--------------------+----------------------+--------------------------| | FK_Artists_Country | Artists | Country | +--------------------+----------------------+--------------------------+
Pro poslední dva sloupce předám příslušné hodnoty do OBJECT_NAME()
funkce tak, že vrací název každého nadřazeného objektu.
Příklad 3 – Použití OBJECT_NAME() v klauzuli WHERE
Zde je příklad použití OBJECT_NAME()
v WHERE
doložka.
SELECT name, object_id, type_desc FROM sys.objects WHERE name = OBJECT_NAME(1253579504);
Výsledek:
+--------------------+-------------+------------------------+ | name | object_id | type_desc | |--------------------+-------------+------------------------| | FK_Artists_Country | 1253579504 | FOREIGN_KEY_CONSTRAINT | +--------------------+-------------+------------------------+
Křížové databázové dotazy
Ve výchozím nastavení SQL Server předpokládá, že ID objektu je v kontextu aktuální databáze. Dotaz, který odkazuje na ID v jiné databázi, vrátí hodnotu NULL nebo nesprávné výsledky.
Pokud potřebujete najít název objektu z jiné databáze, můžete zadat ID této databáze jako druhý argument při volání OBJECT_NAME()
.
Příklady viz Jak získat OBJECT_NAME() z jiné databáze na serveru SQL.