Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Verwenden Sie OBJECT_NAME(), um den Namen eines Objekts aus seiner object_id in SQL Server abzurufen

Wenn Sie SQL Server verwenden, wenn Sie jemals dabei sind, einen Join gegen die sys.objects durchzuführen System-Katalogansicht, um den Namen eines Objekts zu erhalten, halten Sie vielleicht an und lesen Sie dies zuerst.

Transact-SQL verfügt über eine integrierte Funktion namens OBJECT_NAME() die den Namen eines Objekts basierend auf seiner ID zurückgibt.

Mit anderen Worten, wenn Sie die ID des Objekts haben (z. B. die object_id Spalte), können Sie diese ID einfach an OBJECT_NAME() übergeben -Funktion und gibt den Namen des Objekts für Sie zurück – kein Join erforderlich!

Beispiel 1 – Grundlegende Verwendung

Hier ist ein einfaches Beispiel, um zu demonstrieren, wie es funktioniert.

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

Ergebnis:

+---------+------------+--------------------- ----+| Name | Objekt-ID | OBJECT_NAME(object_id) ||---------+-------------+-------------------- ------|| Künstler | 885578193 | Künstler |+---------+---------------------+------------------------------- ---+

Hier können wir sehen, dass die ersten beiden Spalten den Namen und die ID des Objekts anzeigen. Die dritte Spalte verwendet den OBJECT_NAME() Funktion, um den Namen aus der ID zurückzugeben.

Dies ist offensichtlich nur ein Beispiel, aber in diesem Fall wird OBJECT_NAME() verwendet war unnötig, weil sys.objects gibt bereits den Namen des Objekts zurück.

Das nächste Beispiel zeigt, wo OBJECT_NAME() kann sich als nützlich erweisen.

Beispiel 2 – Ein nützlicheres Beispiel

In diesem Beispiel gebe ich Informationen über einen Fremdschlüssel zurück, indem ich sys.foreign_keys abfrage Systemkatalogansicht.

Wählen wir zunächst alle Spalten aus, um zu sehen, was diese Ansicht zurückgibt:

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

Ergebnis (bei vertikaler Ausgabe):

| FK_Artists_Countryobject_id | 1253579504Prinzipal_ID | NULLschema_id | 1parent_object_id | 885578193Typ | F type_desc | FOREIGN_KEY_CONSTRAINTcreate_date | 2019-08-27 16:14:39.560modify_date | 2019-08-28 03:28:07.040is_ms_shipped | 0ist_veröffentlicht | 0is_schema_published | 0referenzierte_Objekt_ID | 1205579333key_index_id | 1ist_deaktiviert | 0is_not_for_replication | 0ist_nicht_vertrauenswürdig | 0delete_referential_action | 0delete_referential_action_desc | NO_ACTIONupdate_referential_action | 0update_referential_action_desc | NO_ACTIONist_system_benannt | 0

Diese Ansicht gibt den Namen des Fremdschlüssels zurück, aber nicht den Namen seines übergeordneten Objekts. Es gibt auch nicht den Namen des referenzierten Objekts des Fremdschlüssels zurück. Es gibt nur die ID dieser Objekte zurück (nämlich parent_object_id und referenced_object_id ).

Wenn wir es also auf diese Spalten eingrenzen würden, würden wir etwa Folgendes erhalten:

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

Ergebnis:

+--------------------+--------------------+---- --------------------+| Name | parent_object_id | Referenzobjekt-ID ||--------------------+--------------------+----- -------------------|| FK_Künstler_Land | 885578193 | 1205579333 |+--------------------+--------------------+----- -------------------+

Glücklicherweise können wir die letzten beiden Spalten an OBJECT_NAME() übergeben um die Objektnamen abzurufen.

Folgendes können wir tun, um die Namen zurückzugeben.

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_keysWHERE name ='FK_Artists_Country';

Ergebnis:

+--------------------+---------------------+-- ------------------------+| Fremdschlüssel | Übergeordneter Objektname | Name des referenzierten Objekts ||--------------------+---------------------+- -------------------------|| FK_Künstler_Land | Künstler | Land |+--------------------+---------------------+--- -----------------------+

Für die letzten beiden Spalten übergebe ich die relevanten Werte an OBJECT_NAME() Funktion, sodass sie den Namen jedes übergeordneten Objekts zurückgibt.

Beispiel 3 – Verwendung von OBJECT_NAME() in einer WHERE-Klausel

Hier ist ein Beispiel für die Verwendung von OBJECT_NAME() in einem WHERE Klausel.

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

Ergebnis:

+--------------------+---------------------+----------- -------------+| Name | Objekt-ID | type_desc ||--------------------+---------------------+----------- ------------|| FK_Künstler_Land | 1253579504 | FOREIGN_KEY_CONSTRAINT |+--------------------+-------------+------------ -------------+

Datenbankübergreifende Abfragen

Standardmäßig geht SQL Server davon aus, dass sich die Objekt-ID im Kontext der aktuellen Datenbank befindet. Eine Abfrage, die auf eine ID in einer anderen Datenbank verweist, gibt NULL oder falsche Ergebnisse zurück.

Wenn Sie einen Objektnamen aus einer anderen Datenbank finden müssen, können Sie die ID dieser Datenbank als zweites Argument beim Aufruf von OBJECT_NAME() angeben .

Beispiele finden Sie unter Abrufen eines OBJECT_NAME() aus einer anderen Datenbank in SQL Server.