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.