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

Sådan bruges OBJECT_ID() på krydsdatabaseobjekter i SQL Server

En forskel mellem OBJECT_ID() og OBJECT_NAME() i SQL Server er syntaksen, der bruges til krydsdatabaseforespørgsler. Med dette mener jeg, når de bruges på objekter i en anden database.

OBJECT_NAME() funktion har et valgfrit argument, som du kan angive, som angiver database-id'et for den database, der indeholder det objekt, du forsøger at få navnet på. Angivelse af dette argument gør det muligt for dig at få navnet på et objekt i en anden database.

OBJECT_ID() funktion kræver på den anden side ikke et sådant argument. I stedet giver denne funktion dig mulighed for at bruge et 3-delt navn til at angive databasen, skemaet og navnet på det objekt, du forsøger at få ID'et på.

Denne artikel indeholder eksempler på brug af OBJECT_ID() for at hente navnet på et objekt fra en anden database.

Eksempel 1 – Grundlæggende forespørgsel

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

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

Resultat:

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

Her skiftede jeg til WideWorldImportersDW database, forespurgte derefter navnet på et objekt på Music database.

Eksempel 2 – Sammenlignet med den nuværende database

Som standard antager SQL Server, at objektnavnet er i konteksten af ​​den aktuelle database. Så hvis du ikke bruger et 3-delt navn til at angive et objekt i en anden database, vil SQL Server Database Engine kun se i den aktuelle database.

Her er den samme kode fra det forrige eksempel, bortset fra at denne gang inkluderer jeg 1 del og 2 delnavne. Jeg kører også koden to gange:første gang den køres i Music database, anden gang den køres i WideWorldImportersDW database:

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];

Resultat:

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)

I det første resultat returnerer alle tre kolonner det korrekte ID. Dette skyldes, at den aktuelle database er Music , og det er der, objektet ligger.

I det andet resultat er det kun de 3 dele, der er i stand til at finde det korrekte objekt. Dette kan forventes, fordi navnene på 1 del og 2 del ikke angiver navnet på databasen, derfor antager det, at objektet er i WideWorldImportersDW (forkert) database.

Hvis begge databaser havde et skema-omfattet objekt kaldet Artists så har vi måske fået et andet resultat. I sådanne tilfælde ville det være let fejlagtigt at antage, at resultatet er korrekt, når det faktisk ikke er det.


  1. MariaDB LENGTHB() Forklaret

  2. DatoDiff til output timer og minutter

  3. MYSQL OR vs IN ydeevne

  4. Indstilling af Django til at bruge MySQL