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

Holen Sie sich die ID eines Objekts aus seinem Namen in SQL Server:OBJECT_ID()

In SQL Server können Sie die OBJECT_ID() verwenden Funktion, um die ID eines Objekts basierend auf seinem Namen zurückzugeben.

Dies kann nützlich sein, wenn Sie die ID eines Objekts benötigen, aber nur seinen Namen kennen.

Die offizielle Definition von OBJECT_ID() ist, dass es die Datenbankobjekt-Identifikationsnummer eines schemabezogenen Objekts zurückgibt .

Beispiel 1 – Grundlegende Verwendung

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

SELECT OBJECT_ID('Artists') AS Result;

Ergebnis:

+-----------+| Ergebnis ||-----------|| 885578193 |+-----------+

In diesem Fall enthält die aktuelle Datenbank ein Objekt namens Albums , und seine ID ist 885578193. Dies ist die ID, die Sie in object_id finden können Spalte der sys.objects Systemkatalogansicht.

Beispiel 2 – Überprüfen Sie die sys.objects-Ansicht

Hier ist ein weiteres einfaches Beispiel, um zu überprüfen, was ich gerade gesagt habe.

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

Ergebnis:

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

Die sys.objects Die Systemkatalogansicht enthält eine Zeile für jedes benutzerdefinierte Objekt mit Schemabereich, das in einer Datenbank erstellt wird.

In diesem Beispiel zeigen die ersten beiden Spalten den name des Objekts an und object_id bzw.

In der dritten Spalte dieses Beispiels verwende ich OBJECT_ID() um die ID des Objekts basierend auf seinem Namen zurückzugeben. Dazu übergebe ich die Namensspalte an OBJECT_ID() Funktion.

Dies ist offensichtlich nur ein Beispiel und verwendet OBJECT_ID() war in diesem Fall unnötig, weil sys.objects gibt bereits die ID des Objekts zurück.

Beispiel 3 – Ein nützlicheres Beispiel

In diesem Beispiel verwende ich OBJECT_ID() in einem WHERE -Klausel, sodass ich nur Ergebnisse erhalte, die sich auf die Tabelle mit dem Namen Client beziehen .

SELECT OBJECT_NAME(referencing_id) AS [Referencing Entity], OBJECT_NAME(referencing_minor_id) AS [Referencing Minor Entity], referencing_class_desc AS [Class], COL_NAME(referenced_id, referenced_minor_id) AS [Spalte]FROM sys.sql_expression_dependenciesWHERE referenced_id =OBJECT_ID(' Kunde');

Ergebnis:

+---------------------+------------------------------- -----+------------------+------------+| Referenzierende Entität | Verweis auf Nebenentität | Klasse | Spalte ||----------------------+-------------------------------- ----+------------------+------------|| uspGetClient | NULL | OBJECT_OR_COLUMN | NULL || uspGetOrdersByClient | NULL | OBJECT_OR_COLUMN | NULL || chkClientCode | NULL | OBJECT_OR_COLUMN | Kundencode |+----------------------+-------------------------------- ----+------------------+------------+

In diesem Fall wollte ich sehen, welche Entitäten vom Client abhängen Tabelle (d. h. welche Entitäten referenzieren diese Tabelle in ihrem SQL-Code). Die referenced_id Spalte verwendet die ID des Objekts, also durch Verwendung von OBJECT_ID() , konnte ich die ID des Client abrufen Tabelle und vergleichen Sie sie mit referenced_id .

Siehe Abhängigkeiten in SQL Server suchen:sql_expression_dependencies für eine ausführlichere Erläuterung dieser Abfrage und zugehörige Beispiele.

Beispiel 4 – Vollständig qualifizierte Namen

Sie haben auch die Möglichkeit, den Objektnamen mit dem Schemanamen und auf Wunsch auch mit dem Datenbanknamen zu qualifizieren.

Hier ist ein einfaches Beispiel zur Veranschaulichung:

SELECT OBJECT_ID('Künstler') AS [1 Part Name], OBJECT_ID('dbo.Artists') AS [2 Part Name], OBJECT_ID('Music.dbo.Artists') AS [3 Part Name];

Ergebnis:

+----------+---------------+------------- -+| 1 Teilename | 2 Teilname | 3 Teilname ||--+---------------+--------------------- --|| 885578193 | 885578193 | 885578193 |+---------------+---------------+--------------- +

Hier ist es noch einmal, diesmal mit eckigen Klammern als Trennzeichen:

SELECT OBJECT_ID('[Künstler]') AS [1 Name des Teils], OBJECT_ID('[dbo].[Künstler]') AS [2 Name des Teils], OBJECT_ID('[Musik].[dbo].[ Künstler]') AS [Name des 3. Teils];

Ergebnis:

+----------+---------------+------------- -+| 1 Teilename | 2 Teilname | 3 Teilname ||--+---------------+--------------------- --|| 885578193 | 885578193 | 885578193 |+---------------+---------------+--------------- +

Gleiches Ergebnis.

Wenn Sie jemals ein NULL-Ergebnis erhalten, obwohl Sie wissen, dass das Objekt existiert, versuchen Sie, es mit dem Schema (und sogar dem Datenbanknamen) zu qualifizieren.

Beispiel 5 – Datenbankübergreifende Abfragen

Standardmäßig geht SQL Server davon aus, dass sich der Objektname im Kontext der aktuellen Datenbank befindet. Sie können einen dreiteiligen Namen verwenden, um ein Objekt in einer anderen Datenbank anzugeben.

Hier ist derselbe Code aus dem vorherigen Beispiel, außer dass ich den Code diesmal zweimal ausführe:das erste Mal, wenn er in Music ausgeführt wird Datenbank, das zweite Mal, wenn es in WideWorldImportersDW ausgeführt wird Datenbank:

USE Music;SELECT OBJECT_ID('Artists') AS [1 Part Name], OBJECT_ID('dbo.Artists') AS [2 Part Name], OBJECT_ID('Music.dbo.Artists') AS [3 Part Name ];WideWorldImportersDW VERWENDEN;SELECT OBJECT_ID('Artists') AS [1 Part Name], OBJECT_ID('dbo.Artists') AS [2 Part Name], OBJECT_ID('Music.dbo.Artists') AS [3 Part Name];

Ergebnis:

Datenbankkontext in 'Musik' geändert.+---------------+---------------+------ ---------+| 1 Teilename | 2 Teilname | 3 Teilname ||--+---------------+--------------------- --|| 885578193 | 885578193 | 885578193 |+---------------+---------------+--------------- +(1 Zeile betroffen)Datenbankkontext in „WideWorldImportersDW“ geändert.+---------------+---------------+--- -------------+| 1 Teilename | 2 Teilname | 3 Teilname ||--+---------------+--------------------- --|| NULL | NULL | 885578193 |+---------------+---------------+--------------- +(1 Zeile betroffen)

Im ersten Ergebnis geben alle drei Spalten die richtige ID zurück. Das liegt daran, dass sich das Objekt zufällig in Music befindet Datenbank.

Im zweiten Ergebnis kann nur der 3-teilige Name das richtige Objekt finden. Dies ist zu erwarten, da die Namen von 1-Teil und 2-Teil nicht den Namen der Datenbank angeben, daher wird davon ausgegangen, dass sich das Objekt in WideWorldImportersDW befindet (falsche) Datenbank.

Beispiel 6 – Geben Sie den Objekttyp an

Die OBJECT_ID() Die Funktion akzeptiert auch ein Argument für den Objekttyp. Dieses Argument steht, sofern angegeben, nach dem Namen des Objekts.

Beispiel:

SELECT OBJECT_ID('Künstler', 'U') AS [Tabelle];

Ergebnis:

+-----------+| Tabelle ||-----------|| 885578193 |+-----------+

Hier gebe ich an, dass der Objekttyp U ist , was „Tabelle (benutzerdefiniert)“ bedeutet.

Wenn ich versuche, einen anderen Objekttyp anzugeben, erhalte ich NULL :

SELECT OBJECT_ID('Künstler', 'U') AS [Tabelle], OBJECT_ID('Künstler', 'V') AS [Ansicht], OBJECT_ID('Künstler', 'P') AS [gespeicherte Prozedur]; 

Ergebnis:

+-----------+--------+--------------------+| Tabelle | Anzeigen | Gespeicherte Prozedur ||-----------+--------+--------------------|| 885578193 | NULL | NULL |+-----------+--------+--------------------+

Hier ist es noch einmal, aber stattdessen mit dem Namen einer Ansicht:

SELECT OBJECT_ID('RockAlbums', 'U') AS [Table], OBJECT_ID('RockAlbums', 'V') AS [View], OBJECT_ID('RockAlbums', 'P') AS [Stored Procedure]; 

Ergebnis:

+---------+-----------+--------------------+| Tabelle | Anzeigen | Gespeicherte Prozedur ||---------+-----------+--------------------|| NULL | 1525580473 | NULL |+---------+-----------+--------------------+