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

Brug OBJECT_NAME() til at hente et objekts navn fra dets object_id i SQL Server

Når du bruger SQL Server, hvis du nogensinde skulle finde på at lave en join mod sys.objects systemkatalogvisning for at få navnet på et objekt, måske stop og læs dette først.

Transact-SQL har en indbygget funktion kaldet OBJECT_NAME() der returnerer navnet på et objekt baseret på dets ID.

Med andre ord, hvis du har objektets ID (f.eks. object_id kolonne), kan du blot videregive dette id til OBJECT_NAME() funktion, og det vil returnere objektets navn for dig - ingen deltagelse påkrævet!

Eksempel 1 – Grundlæggende brug

Her er et grundlæggende eksempel for at demonstrere, hvordan det virker.

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

Resultat:

+------------------------ ----+| navn | objekt-id | OBJECT_NAME(objekt_id) ||---------+-------------+-------------------- ------|| Kunstnere | 885578193 | Kunstnere |+------------------------ ---+

Her kan vi se, at de to første kolonner viser henholdsvis objektets navn og ID. Den tredje kolonne bruger OBJECT_NAME() funktion for at returnere navnet fra ID'et.

Dette er naturligvis kun et eksempel, men i dette tilfælde ved hjælp af OBJECT_NAME() var unødvendig, fordi sys.objects returnerer allerede objektets navn.

Det næste eksempel viser hvor OBJECT_NAME() kan komme til nytte.

Eksempel 2 – Et mere brugbart eksempel

I dette eksempel returnerer jeg oplysninger om en fremmednøgle ved at forespørge på sys.foreign_keys systemkatalogvisning.

Lad os først vælge alle kolonner for at se, hvad der returneres af denne visning:

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

Resultat (ved hjælp af lodret output):

navn | FK_Artists_Countryobject_id | 1253579504principal_id | NULLschema_id | 1forælder_objekt-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 | 0er_udgivet | 0is_schema_published | 0referenced_object_id | 1205579333key_index_id | 1er_deaktiveret | 0er_ikke_til_replikering | 0is_not_trusted | 0delete_referential_action | 0delete_referential_action_desc | NO_ACTIONupdate_referential_action | 0update_referential_action_desc | NO_ACTION er_systemnavnet | 0

Denne visning returnerer navnet på den fremmede nøgle, men ikke navnet på dets overordnede objekt. Det returnerer heller ikke navnet på fremmednøglens refererede objekt. Det returnerer kun id'et for disse objekter (nemlig parent_object_id og referenced_object_id ).

Så hvis vi skulle indsnævre det til netop disse kolonner, ville vi få noget som dette:

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

Resultat:

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

Heldigvis kan vi videregive de sidste to kolonner til OBJECT_NAME() for at hente objektnavnene.

Her er, hvad vi kan gøre for at returnere navnene.

BRUG musik;VÆLG navn SOM [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';

Resultat:

+--------------------+---------------------+-- ------------------------+| Fremmednøgle | Overordnet objektnavn | Referenceobjektnavn ||---------------------+----------------------------+- --------------------------|| FK_Artists_Country | Kunstnere | Land |+---------------------+----------------------+--- ----------------------------+

For de sidste to kolonner sender jeg de relevante værdier til OBJECT_NAME() funktion, så den returnerer navnet på hvert overordnet objekt.

Eksempel 3 – Brug af OBJECT_NAME() i en WHERE-sætning

Her er et eksempel på brug af OBJECT_NAME() i en WHERE klausul.

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

Resultat:

+--------------------+----------------- --------------+| navn | objekt-id | type_desc ||---------------------+---------------------- ------------|| FK_Artists_Country | 1253579504 | FOREIGN_KEY_CONSTRAINT |+------------------------+-------+------------ ------------+

Forespørgsler på tværs af databaser

Som standard antager SQL Server, at objekt-id'et er i konteksten af ​​den aktuelle database. En forespørgsel, der refererer til et ID i en anden database, returnerer NULL eller forkerte resultater.

Hvis du har brug for at finde et objektnavn fra en anden database, kan du angive databasens id som et andet argument, når du kalder OBJECT_NAME() .

Se Sådan får du et OBJECT_NAME() fra en anden database i SQL Server for eksempler.


  1. Hvordan opretter man id med AUTO_INCREMENT på Oracle?

  2. Gendannelse af SQL Server-masterdatabasen

  3. CHR() Funktion i Oracle

  4. MySQL:Sorter GROUP_CONCAT-værdier