Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment utiliser OBJECT_ID() sur des objets inter-base de données dans SQL Server

Une différence entre OBJECT_ID() et OBJECT_NAME() dans SQL Server est la syntaxe utilisée pour les requêtes inter-bases de données. J'entends par là, lorsqu'ils sont utilisés sur des objets dans une base de données différente.

Le OBJECT_NAME() La fonction a un argument facultatif que vous pouvez fournir, qui spécifie l'ID de base de données de la base de données qui contient l'objet dont vous essayez d'obtenir le nom. Fournir cet argument vous permet d'obtenir le nom d'un objet sur une autre base de données.

Le OBJECT_ID() fonction d'autre part, ne nécessite pas un tel argument. Au lieu de cela, cette fonction vous permet d'utiliser un nom en 3 parties pour spécifier la base de données, le schéma et le nom de l'objet dont vous essayez d'obtenir l'ID.

Cet article contient des exemples d'utilisation de OBJECT_ID() pour obtenir le nom d'un objet à partir d'une autre base de données.

Exemple 1 – Requête de base

Voici un exemple de base pour montrer comment cela fonctionne.

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

Résultat :

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

Ici, je suis passé au WideWorldImportersDW base de données, puis a interrogé le nom d'un objet sur la Music base de données.

Exemple 2 - Comparé à la base de données actuelle

Par défaut, SQL Server suppose que le nom de l'objet se trouve dans le contexte de la base de données actuelle. Ainsi, si vous n'utilisez pas un nom en 3 parties pour spécifier un objet dans une base de données différente, le moteur de base de données SQL Server ne recherchera que dans la base de données actuelle.

Voici le même code de l'exemple précédent, sauf que cette fois j'inclus 1 partie et 2 noms de partie. De plus, j'exécute le code deux fois :la première fois qu'il est exécuté dans la section Music base de données, la deuxième fois qu'il est exécuté dans le WideWorldImportersDW base de données :

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

Résultat :

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)

Dans le premier résultat, les trois colonnes renvoient l'ID correct. C'est parce que la base de données actuelle est Music , et c'est là que réside l'objet.

Dans le deuxième résultat, seul le nom en 3 parties est capable de trouver l'objet correct. Il faut s'y attendre, car les noms de la partie 1 et de la partie 2 ne spécifient pas le nom de la base de données, il suppose donc que l'objet se trouve dans WideWorldImportersDW (mauvaise) base de données.

Si les deux bases de données avaient un objet de portée de schéma appelé Artists alors nous aurions peut-être obtenu un résultat différent. Dans de tels cas, il serait facile de supposer à tort que le résultat est correct alors qu'en fait ce n'est pas le cas.