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

Come utilizzare OBJECT_ID() su oggetti tra database in SQL Server

Una differenza tra OBJECT_ID() e OBJECT_NAME() in SQL Server è la sintassi utilizzata per le query tra database. Con questo intendo quando vengono utilizzati su oggetti in un database diverso.

Il OBJECT_NAME() La funzione ha un argomento facoltativo che puoi fornire, che specifica l'ID database del database che contiene l'oggetto di cui stai cercando di ottenere il nome. Fornire questo argomento consente di ottenere il nome di un oggetto su un database diverso.

Il OBJECT_ID() funzione d'altra parte, non richiede tale argomento. Invece, questa funzione ti consente di utilizzare un nome in 3 parti per specificare il database, lo schema e il nome dell'oggetto di cui stai cercando di ottenere l'ID.

Questo articolo contiene esempi di utilizzo di OBJECT_ID() per ottenere il nome di un oggetto da un database diverso.

Esempio 1 – Query di base

Ecco un esempio di base per dimostrare come funziona.

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

Risultato:

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

Qui, sono passato a WideWorldImportersDW database, quindi ha richiesto il nome di un oggetto su Music banca dati.

Esempio 2:confronto con il database corrente

Per impostazione predefinita, SQL Server presuppone che il nome dell'oggetto sia nel contesto del database corrente. Pertanto, se non utilizzi un nome di 3 parti per specificare un oggetto in un database diverso, Motore di database di SQL Server cercherà solo nel database corrente.

Ecco lo stesso codice dell'esempio precedente, tranne che questa volta includo 1 parte e 2 nomi di parte. Inoltre, eseguo il codice due volte:la prima volta che viene eseguito in Music database, la seconda volta che viene eseguito nel WideWorldImportersDW banca dati:

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

Risultato:

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)

Nel primo risultato, tutte e tre le colonne restituiscono l'ID corretto. Questo perché il database corrente è Music , ed è lì che risiede l'oggetto.

Nel secondo risultato, solo il nome della parte 3 è in grado di trovare l'oggetto corretto. Questo è prevedibile, perché i nomi 1 parte e 2 parti non specificano il nome del database, quindi presuppone che l'oggetto sia nel WideWorldImportersDW banca dati (errata).

Se entrambi i database avessero un oggetto con ambito schema chiamato Artists allora potremmo aver ottenuto un risultato diverso. In questi casi, sarebbe facile presumere erroneamente che il risultato sia corretto quando in realtà non lo è.