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

So verwenden Sie OBJECT_ID() für datenbankübergreifende Objekte in SQL Server

Ein Unterschied zwischen OBJECT_ID() und OBJECT_NAME() in SQL Server ist die Syntax, die für datenbankübergreifende Abfragen verwendet wird. Damit meine ich, wenn sie für Objekte in einer anderen Datenbank verwendet werden.

Das OBJECT_NAME() Die Funktion hat ein optionales Argument, das Sie angeben können und das die Datenbank-ID der Datenbank angibt, die das Objekt enthält, dessen Namen Sie abrufen möchten. Wenn Sie dieses Argument angeben, können Sie den Namen eines Objekts in einer anderen Datenbank abrufen.

Die OBJECT_ID() Funktion hingegen erfordert kein solches Argument. Stattdessen können Sie mit dieser Funktion einen dreiteiligen Namen verwenden, um die Datenbank, das Schema und den Namen des Objekts anzugeben, dessen ID Sie abrufen möchten.

Dieser Artikel enthält Beispiele für die Verwendung von OBJECT_ID() um den Namen eines Objekts aus einer anderen Datenbank zu erhalten.

Beispiel 1 – Grundlegende Abfrage

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

USE WideWorldImportersDW;
SELECT OBJECT_ID('Music.dbo.Artists') AS Result;

Ergebnis:

+-----------+
| Result    |
|-----------|
| 885578193 |
+-----------+

Hier bin ich auf WideWorldImportersDW umgestiegen Datenbank und dann den Namen eines Objekts auf der Music abgefragt Datenbank.

Beispiel 2 – Vergleich mit der aktuellen Datenbank

Standardmäßig geht SQL Server davon aus, dass sich der Objektname im Kontext der aktuellen Datenbank befindet. Wenn Sie also keinen dreiteiligen Namen verwenden, um ein Objekt in einer anderen Datenbank anzugeben, sucht die SQL Server-Datenbank-Engine nur in der aktuellen Datenbank.

Hier ist derselbe Code aus dem vorherigen Beispiel, außer dass ich diesmal 1-Teil- und 2-Teil-Namen einfüge. Außerdem führe ich den Code zweimal aus: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];

USE WideWorldImportersDW;
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:

Changed database context to 'Music'.
+---------------+---------------+---------------+
| 1 Part Name   | 2 Part Name   | 3 Part Name   |
|---------------+---------------+---------------|
| 885578193     | 885578193     | 885578193     |
+---------------+---------------+---------------+
(1 row affected)
Changed database context to 'WideWorldImportersDW'.
+---------------+---------------+---------------+
| 1 Part Name   | 2 Part Name   | 3 Part Name   |
|---------------+---------------+---------------|
| NULL          | NULL          | 885578193     |
+---------------+---------------+---------------+
(1 row affected)

Im ersten Ergebnis geben alle drei Spalten die richtige ID zurück. Das liegt daran, dass die aktuelle Datenbank Music ist , und dort befindet sich das Objekt.

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.

Wenn beide Datenbanken ein schemabezogenes Objekt namens Artists hätten dann wären wir vielleicht zu einem anderen Ergebnis gekommen. In solchen Fällen wäre es leicht, fälschlicherweise anzunehmen, dass das Ergebnis korrekt ist, obwohl dies in Wirklichkeit nicht der Fall ist.