Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Utilizzare OBJECT_NAME() per ottenere il nome di un oggetto dal relativo object_id in SQL Server

Quando si utilizza SQL Server, se mai ti ritrovi a fare un join con sys.objects vista del catalogo di sistema per ottenere il nome di un oggetto, magari prima fermarsi e leggerlo.

Transact-SQL ha una funzione integrata chiamata OBJECT_NAME() che restituisce il nome di un oggetto, in base al suo ID.

In altre parole, se hai l'ID dell'oggetto (ad esempio, object_id colonna), puoi semplicemente passare quell'ID a OBJECT_NAME() funzione e restituirà il nome dell'oggetto per te - non è richiesto alcun join!

Esempio 1 – Utilizzo di base

Ecco un esempio di base per dimostrare come funziona.

SELECT 
  name,
  object_id,
  OBJECT_NAME(object_id) AS [OBJECT_NAME(object_id)]
FROM sys.objects
WHERE name = 'Artists';

Risultato:

+---------+-------------+--------------------------+
| name    | object_id   | OBJECT_NAME(object_id)   |
|---------+-------------+--------------------------|
| Artists | 885578193   | Artists                  |
+---------+-------------+--------------------------+

Qui, possiamo vedere che le prime due colonne mostrano rispettivamente il nome e l'ID dell'oggetto. La terza colonna utilizza OBJECT_NAME() funzione per restituire il nome dall'ID.

Questo è ovviamente solo un esempio, ma in questo caso, usando OBJECT_NAME() non era necessario perché sys.objects restituisce già il nome dell'oggetto.

L'esempio successivo mostra dove OBJECT_NAME() può tornare utile.

Esempio 2:un esempio più utile

In questo esempio, restituisco informazioni su una chiave esterna eseguendo una query su sys.foreign_keys vista catalogo di sistema.

Per prima cosa, selezioniamo tutte le colonne per vedere cosa viene restituito da questa vista:

USE Music;
SELECT * 
FROM sys.foreign_keys
WHERE name = 'FK_Artists_Country';

Risultato (usando l'output verticale):

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

Questa vista restituisce il nome della chiave esterna, ma non il nome del suo oggetto padre. Né restituisce il nome dell'oggetto di riferimento della chiave esterna. Restituisce solo l'ID di quegli oggetti (vale a dire, parent_object_id e referenced_object_id ).

Quindi, se dovessimo restringere il campo solo a quelle colonne, otterremmo qualcosa del genere:

USE Music;
SELECT
  name,
  parent_object_id,
  referenced_object_id
FROM sys.foreign_keys
WHERE name = 'FK_Artists_Country';

Risultato:

+--------------------+--------------------+------------------------+
| name               | parent_object_id   | referenced_object_id   |
|--------------------+--------------------+------------------------|
| FK_Artists_Country | 885578193          | 1205579333             |
+--------------------+--------------------+------------------------+

Fortunatamente, possiamo passare le ultime due colonne a OBJECT_NAME() per recuperare i nomi degli oggetti.

Ecco cosa possiamo fare per restituire i nomi.

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';

Risultato:

+--------------------+----------------------+--------------------------+
| Foreign Key        | Parent Object Name   | Referenced Object Name   |
|--------------------+----------------------+--------------------------|
| FK_Artists_Country | Artists              | Country                  |
+--------------------+----------------------+--------------------------+

Per le ultime due colonne, passo i valori rilevanti a OBJECT_NAME() funzione in modo che restituisca il nome di ogni oggetto padre.

Esempio 3:utilizzo di OBJECT_NAME() in una clausola WHERE

Ecco un esempio di utilizzo di OBJECT_NAME() in un WHERE clausola.

SELECT 
  name, 
  object_id, 
  type_desc  
FROM sys.objects  
WHERE name = OBJECT_NAME(1253579504);

Risultato:

+--------------------+-------------+------------------------+
| name               | object_id   | type_desc              |
|--------------------+-------------+------------------------|
| FK_Artists_Country | 1253579504  | FOREIGN_KEY_CONSTRAINT |
+--------------------+-------------+------------------------+

Query incrociate nel database

Per impostazione predefinita, SQL Server presuppone che l'ID oggetto sia nel contesto del database corrente. Una query che fa riferimento a un ID in un altro database restituisce NULL o risultati errati.

Se devi trovare un nome oggetto da un database diverso, puoi fornire l'ID di quel database come secondo argomento quando chiami OBJECT_NAME() .

Vedere Come ottenere un OBJECT_NAME() da un database diverso in SQL Server per esempi.