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

Obtenir l'ID d'un objet à partir de son nom dans SQL Server :OBJECT_ID()

Dans SQL Server, vous pouvez utiliser le OBJECT_ID() fonction pour renvoyer l'ID d'un objet, en fonction de son nom.

Cela peut être utile lorsque vous avez besoin de l'ID d'un objet, mais que vous ne connaissez que son nom.

La définition officielle de OBJECT_ID() est qu'il renvoie le numéro d'identification de l'objet de base de données d'un objet de portée de schéma .

Exemple 1 - Utilisation de base

Voici un exemple de base pour montrer comment cela fonctionne.

SELECT OBJECT_ID('Artists') AS Result ;

Résultat :

+-----------+| Résultat ||-----------|| 885578193 |+-----------+

Dans ce cas, la base de données actuelle contient un objet appelé Albums , et son ID est 885578193. C'est l'ID que vous pouvez trouver dans le object_id colonne du sys.objects vue du catalogue système.

Exemple 2 - Vérifier la vue sys.objects

Voici un autre exemple de base pour vérifier ce que je viens de dire.

SELECT name, object_id, OBJECT_ID(name) AS [OBJECT_ID(name)]FROM sys.objectsWHERE name ='Artists';

Résultat :

+---------+-------------+-------------------+| nom | objet_id | OBJECT_ID(nom) ||---------+-------------+-------------------| | Artistes | 885578193 | 885578193 |+---------+-------------+-------------------+

Les sys.objects la vue du catalogue système contient une ligne pour chaque objet défini par l'utilisateur et étendu au schéma qui est créé dans une base de données.

Dans cet exemple, les deux premières colonnes affichent le name de l'objet et object_id respectivement.

Dans la troisième colonne de cet exemple, j'utilise OBJECT_ID() pour renvoyer l'ID de l'objet en fonction de son nom. Pour ce faire, je passe la colonne name au OBJECT_ID() fonction.

Ce n'est évidemment qu'un exemple, et en utilisant OBJECT_ID() n'était pas nécessaire dans ce cas, car sys.objects renvoie déjà l'ID de l'objet.

Exemple 3 - Un exemple plus utile

Dans cet exemple, j'utilise OBJECT_ID() dans un WHERE clause afin que je n'obtienne que des résultats liés à la table appelée Client .

SELECT OBJECT_NAME(referencing_id) AS [Referencing Entity], OBJECT_NAME(referencing_minor_id) AS [Referencing Minor Entity], referencing_class_desc AS [Class], COL_NAME(referenced_id, referenced_minor_id) AS [Column]FROM sys.sql_expression_dependenciesWHERE referenced_id =OBJECT_ID(' Client');

Résultat :

+----------------------+----------------------- -----+------------------+------------+| Entité de référencement | Référencement d'une entité mineure | Classe | Colonne ||----------------------+------------------------ ----+------------------+------------|| uspGetClient | NUL | OBJECT_OR_COLUMN | NUL || uspGetOrdersByClient | NUL | OBJECT_OR_COLUMN | NUL || chkCodeClient | NUL | OBJECT_OR_COLUMN | CodeClient |+----------------------+------------------------ ----+-------------+------------+

Dans ce cas, je voulais voir quelles entités dépendent du Client table (c'est-à-dire quelles entités référencent cette table dans leur code SQL). Le referenced_id la colonne utilise l'ID de l'objet, donc en utilisant OBJECT_ID() , j'ai pu obtenir l'ID du Client table et comparez-la à referenced_id .

Voir Rechercher des dépendances dans SQL Server :sql_expression_dependencies pour une explication plus détaillée de cette requête et des exemples associés.

Exemple 4 – Noms complets

Vous avez également la possibilité de qualifier le nom de l'objet avec le nom du schéma, ainsi que le nom de la base de données si vous le souhaitez.

Voici un exemple simple pour illustrer :

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 :

+---------------+---------------+---------------------- -+| 1 Nom de la pièce | 2 Nom de la pièce | 3 Nom de la pièce ||---------------+---------------+------------- --|| 885578193 | 885578193 | 885578193 |+---------------+---------------+--------------- +

Le voici à nouveau, cette fois en utilisant des crochets comme délimiteurs :

SELECT OBJECT_ID('[Artists]') AS [1 Part Name], OBJECT_ID('[dbo].[Artists]') AS [2 Part Name], OBJECT_ID('[Music].[dbo].[ Artistes]') AS [3 Nom de la partie] ;

Résultat :

+---------------+---------------+---------------------- -+| 1 Nom de la pièce | 2 Nom de la pièce | 3 Nom de la pièce ||---------------+---------------+------------- --|| 885578193 | 885578193 | 885578193 |+---------------+---------------+--------------- +

Même résultat.

Si jamais vous obtenez un résultat NULL même si vous savez que l'objet existe, essayez de le qualifier avec le schéma (et même le nom de la base de données).

Exemple 5 - Requêtes inter-base de données

Par défaut, SQL Server suppose que le nom de l'objet se trouve dans le contexte de la base de données actuelle. Vous pouvez utiliser un nom en 3 parties pour spécifier un objet dans une base de données différente.

Voici le même code de l'exemple précédent, sauf que cette fois j'exécute le code deux fois :la première fois qu'il est exécuté dans le 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 :

Changement du contexte de la base de données en 'Musique'.+---------------+---------------+------ ---------+| 1 Nom de la pièce | 2 Nom de la pièce | 3 Nom de la pièce ||---------------+---------------+------------- --|| 885578193 | 885578193 | 885578193 |+---------------+---------------+--------------- +(1 ligne affectée)Contexte de base de données changé en 'WideWorldImportersDW'.+---------------+---------------+--- ------------+| 1 Nom de la pièce | 2 Nom de la pièce | 3 Nom de la pièce ||---------------+---------------+------------- --|| NUL | NUL | 885578193 |+---------------+---------------+--------------- +(1 ligne concernée)

Dans le premier résultat, les trois colonnes renvoient l'ID correct. C'est parce que l'objet se trouve dans la Music base de données.

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.

Exemple 6 - Spécifier le type d'objet

Le OBJECT_ID() La fonction accepte également un argument pour le type d'objet. Cet argument, s'il est fourni, vient après le nom de l'objet.

Exemple :

SELECT OBJECT_ID('Artistes', 'U') AS [Table] ;

Résultat :

+-----------+| Tableau ||-----------|| 885578193 |+-----------+

Ici, je précise que le type d'objet est U , ce qui signifie "Table (définie par l'utilisateur)".

Si j'essaie de spécifier un type d'objet différent, j'obtiens NULL :

SELECT OBJECT_ID('Artists', 'U') AS [Table], OBJECT_ID('Artists', 'V') AS [View], OBJECT_ID('Artists', 'P') AS [Stored Procedure] ; 

Résultat :

+-----------+--------+--------------------+| Tableau | Voir | Procédure stockée ||-----------+--------+--------------------|| 885578193 | NUL | NULL |+-----------+--------+--------------------+

La voici à nouveau, mais avec le nom d'une vue à la place :

SELECT OBJECT_ID('RockAlbums', 'U') AS [Table], OBJECT_ID('RockAlbums', 'V') AS [View], OBJECT_ID('RockAlbums', 'P') AS [Procédure stockée] ; 

Résultat :

+---------+-----------+--------------------+| Tableau | Voir | Procédure stockée ||---------+-----------+--------------------|| NUL | 1525580473 | NULL |+---------+-----------+--------------------+