sql >> Database >  >> RDS >> Sqlserver

OBJECT_ID() gebruiken op cross-databaseobjecten in SQL Server

Eén verschil tussen OBJECT_ID() en OBJECT_NAME() in SQL Server is de syntaxis die wordt gebruikt voor query's tussen databases. Hiermee bedoel ik, wanneer ze worden gebruikt op objecten in een andere database.

De OBJECT_NAME() functie heeft een optioneel argument dat u kunt opgeven, dat de database-ID specificeert van de database die het object bevat waarvan u de naam probeert te krijgen. Door dit argument op te geven, kunt u de naam van een object in een andere database krijgen.

De OBJECT_ID() functie daarentegen heeft zo'n argument niet nodig. In plaats daarvan kunt u met deze functie een driedelige naam gebruiken om de database, het schema en de naam op te geven van het object waarvan u de ID probeert te krijgen.

Dit artikel bevat voorbeelden van het gebruik van OBJECT_ID() om de naam van een object uit een andere database te halen.

Voorbeeld 1 – Basisquery

Hier is een eenvoudig voorbeeld om te laten zien hoe het werkt.

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

Resultaat:

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

Hier schakelde ik over naar de WideWorldImportersDW database en vroeg vervolgens de naam van een object op de Music database.

Voorbeeld 2 – Vergeleken met de huidige database

Standaard gaat SQL Server ervan uit dat de objectnaam zich in de context van de huidige database bevindt. Dus als u geen driedelige naam gebruikt om een ​​object in een andere database op te geven, kijkt de SQL Server Database Engine alleen in de huidige database.

Hier is dezelfde code uit het vorige voorbeeld, behalve dat ik deze keer 1 deel en 2 deelnamen opneem. Ik voer de code ook twee keer uit:de eerste keer dat het wordt uitgevoerd in de Music database, de tweede keer dat het wordt uitgevoerd in de WideWorldImportersDW databank:

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

Resultaat:

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)

In het eerste resultaat retourneren alle drie de kolommen de juiste ID. Dit komt omdat de huidige database Music . is , en dat is waar het object zich bevindt.

In het tweede resultaat kan alleen de 3-delige naam het juiste object vinden. Dit is te verwachten, omdat de namen van 1 deel en 2 delen niet de naam van de database specificeren, daarom wordt aangenomen dat het object zich in de WideWorldImportersDW bevindt (verkeerde) database.

Als beide databases een object met schemabereik hadden met de naam Artists dan hadden we misschien een ander resultaat gekregen. In dergelijke gevallen zou het gemakkelijk zijn om ten onrechte aan te nemen dat het resultaat correct is, terwijl dat in feite niet het geval is.


  1. Onthoud dit bij het formatteren van een TIME-gegevenstype in SQL Server (T-SQL)

  2. Hoe SET ROWCOUNT werkt in SQL Server

  3. Hoe te groeperen op twee kolommen in SQL

  4. Best practices voor MySQL-replicatie