sql >> Database >  >> RDS >> Sqlserver

Gebruik OBJECT_NAME() om de naam van een object op te halen uit zijn object_id in SQL Server

Als u bij het gebruik van SQL Server ooit merkt dat u een join gaat doen tegen de sys.objects systeemcatalogusweergave om de naam van een object te krijgen, stop misschien en lees dit eerst.

Transact-SQL heeft een ingebouwde functie genaamd OBJECT_NAME() die de naam van een object retourneert, gebaseerd op zijn ID.

Met andere woorden, als u de ID van het object hebt (bijvoorbeeld de object_id kolom), kunt u die ID eenvoudig doorgeven aan de OBJECT_NAME() functie, en het zal de naam van het object voor u retourneren - geen deelname vereist!

Voorbeeld 1 – Basisgebruik

Hier is een eenvoudig voorbeeld om te laten zien hoe het werkt.

SELECT naam, object_id, OBJECT_NAME(object_id) AS [OBJECT_NAME(object_id)]FROM sys.objectsWHERE naam ='Artiesten';

Resultaat:

+---------+-------------+---------------------- ----+| naam | object_id | OBJECT_NAME(object_id) ||---------+-------------+-------------------- ------|| Artiesten | 885578193 | Artiesten |+---------+-------------+----------------------- ---+

Hier kunnen we zien dat de eerste twee kolommen respectievelijk de naam en ID van het object weergeven. De derde kolom gebruikt de OBJECT_NAME() functie om de naam van de ID te retourneren.

Dit is natuurlijk maar een voorbeeld, maar in dit geval, met behulp van OBJECT_NAME() was niet nodig omdat sys.objects geeft al de naam van het object terug.

Het volgende voorbeeld laat zien waar OBJECT_NAME() kan van pas komen.

Voorbeeld 2 – Een nuttiger voorbeeld

In dit voorbeeld retourneer ik informatie over een externe sleutel door de sys.foreign_keys op te vragen systeemcatalogusweergave.

Laten we eerst alle kolommen selecteren om te zien wat deze weergave oplevert:

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

Resultaat (met verticale uitvoer):

naam | FK_Artists_Countryobject_id | 1253579504principal_id | NULLschema_id | 1ouder_object_id | 885578193type | F type_desc | FOREIGN_KEY_CONSTRAINTcreate_date | 2019-08-27 16:14:39.560modify_date | 2019-08-28 03:28:07.040is_ms_shipped | 0is_published | 0is_schema_published | 0referenced_object_id | 1205579333key_index_id | 1is_disabled | 0is_not_for_replicatie | 0is_not_trusted | 0delete_referential_action | 0delete_referential_action_desc | NO_ACTIONupdate_referential_action | 0update_referential_action_desc | NO_ACTIONis_system_named | 0

Deze weergave retourneert de naam van de externe sleutel, maar niet de naam van het bovenliggende object. Het retourneert ook niet de naam van het object van de refererende sleutel waarnaar wordt verwezen. Het retourneert alleen de ID van die objecten (namelijk parent_object_id en referenced_object_id ).

Dus als we het zouden beperken tot alleen die kolommen, zouden we zoiets krijgen als dit:

USE Music;SELECT name, parent_object_id, referenced_object_idFROM sys.foreign_keysWHERE name ='FK_Artists_Country';

Resultaat:

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

Gelukkig kunnen we de laatste twee kolommen doorgeven aan OBJECT_NAME() om de objectnamen op te halen.

Dit is wat we kunnen doen om de namen terug te geven.

USE Music;SELECT naam AS [Foreign Key], OBJECT_NAME(parent_object_id) AS [Parent Object Name], OBJECT_NAME(referenced_object_id) AS [Referenced Object Name]FROM sys.foreign_keysWHERE name ='FK_Artists_Country';

Resultaat:

+--------------------+----------------------+-- ------------------------+| Buitenlandse sleutel | Naam bovenliggend object | Naam object waarnaar wordt verwezen ||--------------------+----------------------+- -------------------------|| FK_Artists_Country | Artiesten | Land |+--------------------+----------------------+--- -----------------------+

Voor de laatste twee kolommen geef ik de relevante waarden door aan de OBJECT_NAME() functie zodat het de naam van elk bovenliggend object retourneert.

Voorbeeld 3 – OBJECT_NAME() gebruiken in een WHERE-clausule

Hier is een voorbeeld van het gebruik van OBJECT_NAME() in een WHERE clausule.

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

Resultaat:

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

Cross-databasequery's

Standaard gaat SQL Server ervan uit dat de object-ID zich in de context van de huidige database bevindt. Een query die verwijst naar een ID in een andere database, retourneert NULL of onjuiste resultaten.

Als u een objectnaam uit een andere database moet vinden, kunt u de ID van die database als tweede argument opgeven bij het aanroepen van OBJECT_NAME() .

Zie Een OBJECT_NAME() ophalen uit een andere database in SQL Server voor voorbeelden.


  1. 3 gebieden die baat zullen hebben bij het gebruik van een SQL Server Performance Monitoring Tool

  2. Inzicht in de unieke beperkingen van SQL Server

  3. MySQL cast/converteert automatisch een string naar een nummer?

  4. Hoe indexen voor een database of tabel in MySQL te zien?