sql >> Databáze >  >> RDS >> Sqlserver

Použijte OBJECT_NAME() k získání názvu objektu z jeho object_id na serveru SQL

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.


  1. Jak nainstalovat MySQL 8.0 na CentOS 8 / RHEL 8

  2. Použití Spotlight Cloud k vyřešení blokování serveru SQL

  3. SQL:Vytvoření relační tabulky se 2 různými auto_increment

  4. Jaké jsou rozdíly mezi INSERT a UPDATE v MySQL?