Dans SQL Server, vous pouvez utiliser le PARSENAME()
fonction pour renvoyer une partie d'un nom d'objet.
Par exemple, vous pouvez l'utiliser pour renvoyer la partie schéma (ou toute autre partie) d'un nom en quatre parties tel que server.schema.db.object
.
Syntaxe
La syntaxe ressemble à ceci :
PARSENAME ( 'object_name' , object_piece )
Où object_name
est le nom de l'objet (éventuellement qualifié) et object_piece
est la pièce que vous voulez retourner.
Le object_piece
l'argument doit être un int entre 1 et 4. La valeur détermine la partie du nom de l'objet à renvoyer. Ces valeurs correspondent à la partie objet comme suit :
Valeur | Partie d'objet |
---|---|
1 | Nom de l'objet |
2 | Nom du schéma |
3 | Nom de la base de données |
4 | Nom du serveur |
Exemple 1 - Utilisation de base
Voici un exemple pour illustrer.
SELECT PARSENAME('Homer.dbo.Music.Artists', 4) COMME résultat ;
Résultat :
+----------+| Résultat ||----------|| Homère |+----------+
Dans ce cas, j'ai renvoyé le nom du serveur à partir d'un nom d'objet en quatre parties composé du serveur, du schéma, de la base de données et du nom de la table.
Exemple 2 – Renvoyer toutes les pièces
Voici à quoi cela ressemble si je renvoie toutes les pièces séparément.
DECLARE @object_name char(23) ='Homer.dbo.Music.Artists';SELECT PARSENAME(@object_name, 4) AS [Server], PARSENAME(@object_name, 3) AS [Schema], PARSENAME(@object_name , 2) AS [Database], PARSENAME(@object_name, 1) AS [Object] ;
Résultat :
+----------+----------+------------+----------+ | Serveur | Schéma | Base de données | Objet ||----------+----------+------------+----------|| Homère | dbo | Musique | Artistes |+----------+----------+-----------+----------+Exemple 3 – SQL Server ne vérifie pas le nom
Il est important de savoir que
PARSENAME()
n'indique pas si un objet portant le nom spécifié existe. Il renvoie simplement la partie spécifiée du nom d'objet donné.Par conséquent, vous pouvez transmettre n'importe quelle valeur à la fonction, tant qu'il s'agit d'un sysname valide .
DECLARE @object_name char(28) ='completely.bogus.object.name';SELECT PARSENAME(@object_name, 4) AS [Server], PARSENAME(@object_name, 3) AS [Schema], PARSENAME(@object_name , 2) AS [Database], PARSENAME(@object_name, 1) AS [Object] ;Résultat :
+------------+----------+------------+--------- -+| Serveur | Schéma | Base de données | Objet ||------------+----------+------------+---------- || complètement | faux | objet | nom |+------------+----------+------------+---------- +Exemple 4 - Nom d'objet en trois parties
Voici ce qui se passe si je passe un nom en trois parties.
DECLARE @object_name char(17) ='dbo.Music.Artists';SELECT PARSENAME(@object_name, 4) AS [Server], PARSENAME(@object_name, 3) AS [Schema], PARSENAME(@object_name, 2 ) AS [Database], PARSENAME(@object_name, 1) AS [Object] ;Résultat :
+----------+----------+------------+----------+ | Serveur | Schéma | Base de données | Objet ||----------+----------+------------+----------|| NUL | dbo | Musique | Artistes |+----------+----------+-----------+----------+Exemple 5 - Nom d'objet en deux parties
Voici ce qui se passe si je passe un nom en deux parties.
DECLARE @object_name char(13) ='Music.Artists';SELECT PARSENAME(@object_name, 4) AS [Server], PARSENAME(@object_name, 3) AS [Schema], PARSENAME(@object_name, 2) AS [Database], PARSENAME(@object_name, 1) AS [Object] ;Résultat :
+----------+----------+------------+----------+ | Serveur | Schéma | Base de données | Objet ||----------+----------+------------+----------|| NUL | NUL | Musique | Artistes |+----------+----------+-----------+----------+Exemple 6 - Nom d'objet en une partie
Et, aussi idiot que cela puisse paraître, un nom en une partie.
DECLARE @object_name char(7) ='Artists';SELECT PARSENAME(@object_name, 4) AS [Server], PARSENAME(@object_name, 3) AS [Schema], PARSENAME(@object_name, 2) AS [Database ], PARSENAME(@object_name, 1) AS [Objet] ;Résultat :
+----------+----------+------------+----------+ | Serveur | Schéma | Base de données | Objet ||----------+----------+------------+----------|| NUL | NUL | NUL | Artistes |+----------+----------+-----------+----------+Exemple 7 - Nom d'objet en cinq parties
Voici ce qui se passe si vous fournissez un nom d'objet avec plus de quatre parties.
DECLARE @object_name char(23) ='Oops.Homer.dbo.Music.Artists';SELECT PARSENAME(@object_name, 4) AS [Server], PARSENAME(@object_name, 3) AS [Schema], PARSENAME( @object_name, 2) AS [Database], PARSENAME(@object_name, 1) AS [Object] ;Résultat :
+----------+----------+------------+----------+ | Serveur | Schéma | Base de données | Objet ||----------+----------+------------+----------|| NUL | NUL | NUL | NULL |+----------+----------+------------+----------+Exemple 8 - Autres utilisations
Étant donné que vous pouvez fournir un nom d'objet complètement faux,
PARSENAME()
peut être un hack pratique pour diviser d'autres données délimitées, telles que les adresses IP4.DECLARE @object_name char(15) ='172.217.167.110';SELECT PARSENAME(@object_name, 4) AS [4], PARSENAME(@object_name, 3) AS [3], PARSENAME(@object_name, 2) AS [2], PARSENAME(@object_name, 1) AS [1] ;Résultat :
+-----+-----+-----+-----+| 4 | 3 | 2 | 1 ||-----+-----+-----+-----|| 172 | 217 | 167 | 110 |+-----+-----+-----+-----+Cependant, si vous avez vraiment besoin de le faire, envisagez d'utiliser une méthode différente, telle que
STRING_SPLIT()
.Exemple 9 - Virgules et autres délimiteurs
Étant donné
PARSENAME()
est destiné à être utilisé avec des noms d'objets, vous ne pouvez pas utiliser des virgules comme délimiteurs et vous attendre à ce qu'il fonctionne de la même manière.Voici ce qui se passe si j'essaie de le faire.
DECLARE @object_name char(23) ='Homer,dbo,Music,Artists';SELECT PARSENAME(@object_name, 4) AS [Server], PARSENAME(@object_name, 3) AS [Schema], PARSENAME(@object_name , 2) AS [Database], PARSENAME(@object_name, 1) AS [Object] ;Résultat :
+----------+----------+------------+----------- --------------+| Serveur | Schéma | Base de données | Objet ||----------+----------+------------+------------ --------------|| NUL | NUL | NUL | Homer,dbo,Musique,Artistes |+----------+----------+------------+------ -------------------+Vous devrez remplacer les virgules par un point si vous voulez le faire, ou utiliser une méthode différente, telle que
STRING_SPLIT()
.