sql >> Databasteknik >  >> RDS >> Sqlserver

Använd OBJECT_NAME() för att hämta ett objekts namn från dess object_id i SQL Server

När du använder SQL Server, om du någonsin kommer på att göra en join mot sys.objects systemkatalogvy för att få namnet på ett objekt, kanske stoppa och läsa detta först.

Transact-SQL har en inbyggd funktion som heter OBJECT_NAME() som returnerar namnet på ett objekt, baserat på dess ID.

Med andra ord, om du har objektets ID (till exempel object_id kolumnen) kan du helt enkelt skicka det ID:t till OBJECT_NAME() funktion, och det kommer att returnera objektets namn åt dig – ingen anslutning krävs!

Exempel 1 – Grundläggande användning

Här är ett grundläggande exempel för att visa hur det fungerar.

SELECT name, object_id, OBJECT_NAME(object_id) AS [OBJECT_NAME(object_id)]FRÅN sys.objectsWHERE name ='Artister';

Resultat:

+---------+--------------+-------------------------------- ----+| namn | objekt-id | OBJECT_NAME(objekt_id) ||--------+------------------+--------------------------- ------|| Konstnärer | 885578193 | Konstnärer |+--------+-------------+-------------------------------- ---+

Här kan vi se att de två första kolumnerna visar objektets namn respektive ID. Den tredje kolumnen använder OBJECT_NAME() funktion för att returnera namnet från ID:t.

Detta är uppenbarligen bara ett exempel, men i det här fallet använder du OBJECT_NAME() var onödigt eftersom sys.objects returnerar redan objektets namn.

Nästa exempel visar var OBJECT_NAME() kan komma väl till pass.

Exempel 2 – Ett mer användbart exempel

I det här exemplet returnerar jag information om en främmande nyckel genom att fråga sys.foreign_keys systemkatalogvy.

Låt oss först välja alla kolumner för att se vad som returneras av denna vy:

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

Resultat (med vertikal utdata):

namn | FK_Artists_Countryobject_id | 1253579504principal_id | NULLschema_id | 1parent_object_id | 885578193typ | F typ_desc | FOREIGN_KEY_CONSTRAINTcreate_date | 2019-08-27 16:14:39.560modify_date | 2019-08-28 03:28:07.040is_ms_shipped | 0is_publicerad | 0is_schema_published | 0referenced_object_id | 1205579333key_index_id | 1is_disabled | 0är_inte_för_replikering | 0is_not_trusted | 0delete_referential_action | 0delete_referential_action_desc | NO_ACTIONupdate_referential_action | 0update_referential_action_desc | NO_ACTION heter_systemet | 0

Denna vy returnerar namnet på den främmande nyckeln, men inte namnet på dess överordnade objekt. Det returnerar inte heller namnet på den främmande nyckelns refererade objekt. Den returnerar bara ID:t för dessa objekt (nämligen parent_object_id och referenced_object_id ).

Så om vi skulle begränsa det till bara dessa kolumner, skulle vi få något sånt här:

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

Resultat:

+--------------------+--------------------+---- --------------------+| namn | parent_object_id | refererat_objekt-id ||------------------------+-------------------+----- ------------------|| FK_Artister_Land | 885578193 | 1205579333 |+--------------------+-------------------+----- -------------------+

Lyckligtvis kan vi skicka de två sista kolumnerna till OBJECT_NAME() för att hämta objektnamnen.

Här är vad vi kan göra för att returnera namnen.

ANVÄND musik;VÄLJ namn SOM [Främmande nyckel], 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';

Resultat:

+--------------------+----------------------------+-- ------------------------+| Utländsk nyckel | Namn på överordnat objekt | Refererat objektnamn ||------------------------+----------------------------+- --------------------------|| FK_Artister_Land | Konstnärer | Land |+--------------------+---------------------+--- ----------------------------+

För de två sista kolumnerna skickar jag de relevanta värdena till OBJECT_NAME() funktion så att den returnerar namnet på varje överordnat objekt.

Exempel 3 – Använda OBJECT_NAME() i en WHERE-sats

Här är ett exempel på hur du använder OBJECT_NAME() i en WHERE klausul.

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

Resultat:

+---------------------+-------------+---------------- -------------+| namn | objekt-id | type_desc ||---------------------+---------------------- ------------|| FK_Artister_Land | 1253579504 | FOREIGN_KEY_CONSTRAINT |+------------------------+-------+------------ ------------+

Frågor i korsdatabas

Som standard antar SQL Server att objekt-ID:t är i sammanhanget för den aktuella databasen. En fråga som refererar till ett ID i en annan databas returnerar NULL eller felaktiga resultat.

Om du behöver hitta ett objektnamn från en annan databas kan du ange databasens ID som ett andra argument när du anropar OBJECT_NAME() .

Se Hur man hämtar ett OBJECT_NAME() från en annan databas i SQL Server för exempel.


  1. PostgreSQL vs Linux-kärnversioner

  2. Hur inaktiverar man trigger i Oracle SQL Developer?

  3. MySQL SELECT endast inte null-värden

  4. Hur konverterar man tomma utrymmen till null-värden med hjälp av SQL Server?