sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man använder OBJECT_ID() på korsdatabasobjekt i SQL Server

En skillnad mellan OBJECT_ID() och OBJECT_NAME() i SQL Server är syntaxen som används för korsdatabasfrågor. Med detta menar jag, när de används på objekt i en annan databas.

OBJECT_NAME() funktion har ett valfritt argument som du kan tillhandahålla, vilket anger databas-ID för databasen som innehåller objektet du försöker få namnet på. Genom att tillhandahålla detta argument kan du få namnet på ett objekt i en annan databas.

OBJECT_ID() funktion å andra sidan, kräver inte ett sådant argument. Istället låter den här funktionen dig använda ett tredelat namn för att ange databasen, schemat och namnet på objektet som du försöker få ID:t för.

Den här artikeln innehåller exempel på hur du använder OBJECT_ID() för att hämta namnet på ett objekt från en annan databas.

Exempel 1 – Grundläggande fråga

Här är ett grundläggande exempel för att visa hur det fungerar.

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

Resultat:

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

Här bytte jag till WideWorldImportersDW databas och frågade sedan namnet på ett objekt på Music databas.

Exempel 2 – Jämfört med den aktuella databasen

Som standard antar SQL Server att objektnamnet är i sammanhanget för den aktuella databasen. Så om du inte använder ett 3-delat namn för att specificera ett objekt i en annan databas, kommer SQL Server Database Engine bara att leta i den aktuella databasen.

Här är samma kod från föregående exempel, förutom att den här gången inkluderar 1 del och 2 delnamn. Dessutom kör jag koden två gånger:första gången den körs i Music databas, andra gången den körs i WideWorldImportersDW databas:

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örsta resultatet returnerar alla tre kolumnerna rätt ID. Detta beror på att den aktuella databasen är Music , och det är där objektet finns.

I det andra resultatet är det bara tredelarnas namn som kan hitta rätt objekt. Detta kan förväntas, eftersom 1 delen och 2 delens namn inte anger namnet på databasen, därför antar det att objektet finns i WideWorldImportersDW (fel) databas.

Om båda databaserna hade ett objekt med schemaomfattning som heter Artists då kan vi ha fått ett annat resultat. I sådana fall skulle det vara lätt att felaktigt anta att resultatet är korrekt när det faktiskt inte är det.


  1. Oracle-datum

  2. Uppdatera data i en MySQL-databas

  3. Hur dekrypterar man ett lösenord från SQL-servern?

  4. Hur överför eller exporterar du SQL Server 2005-data till Excel