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.