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):
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.