Identificateurs délimités (Moteur de base de données)

Un identificateur qui respecte toutes les règles relatives au format des identificateurs peut être utilisé avec ou sans délimiteur. S'il ne respecte pas une ou plusieurs de ces règles, il doit toujours être délimité.

[!REMARQUE]

MicrosoftSQL Server ne reconnaît pas les noms de variables et les paramètres de procédures stockées délimités. Ces types d'identificateurs doivent respecter les règles qui s'appliquent aux identificateurs réguliers.

Les identificateurs délimités sont utilisés dans les cas suivants :

  • Lorsque des mots réservés sont utilisés comme noms ou parties de noms d'objets.

    Les mots clés réservés ne doivent jamais être utilisés comme noms d'objets. Les bases de données mises à niveau à partir des versions précédentes de SQL Server peuvent contenir des identificateurs qui comprennent des mots qui n'étaient pas réservés dans la version antérieure, mais le sont dans la version actuelle de SQL Server. Vous pouvez choisir de vous référer à l'objet en utilisant des identificateurs délimités jusqu'à ce que le nom puisse être modifié.

  • Lorsque vous utilisez des caractères non répertoriés comme identificateurs qualifiés.

    SQL Server permet d'utiliser tout caractère de la page de codes en cours dans un identificateur délimité. Un manque de discernement dans l'utilisation de caractères spéciaux dans un nom d'objet peut rendre difficiles la lecture et la maintenance des instructions et scripts SQL. Par exemple, imaginez que vous devez créer une table appelée Employee], où le crochet fermant fait partie du nom. Pour ce faire, vous devez placer deux crochets fermants supplémentaires comme dans l'exemple ci-dessous :

    CREATE TABLE [Employee]]] 
    (
    EmployeeID int IDENTITY (1,1) NOT NULL,
    FirstName varchar(30),
    LastName varchar(30)
    );
    

[!REMARQUE]

Les délimiteurs sont uniquement réservés aux identificateurs. Ils ne peuvent être utilisés pour les mots clés, même s'ils sont marqués comme étant réservés dans SQL Server.

Types de délimiteurs

Voici les types de délimiteurs utilisés dans Transact-SQL :

  • Les identificateurs délimités par des guillemets (") :

    SELECT * FROM "Blanks in Table Name";
    
  • Les indicateurs délimités par des crochets ([ ]) :

    SELECT * FROM [Blanks In Table Name];
    

Les identificateurs entre guillemets peuvent être utilisés uniquement si l'option QUOTED_IDENTIFIER est définie avec la valeur ON. Par défaut le fournisseur SQL Server OLE DB pour SQL Server et le pilote ODBC SQL SQL Server affectent la valeur ON à cette option lorsqu'ils se connectent.

Quelle que soit l'interface utilisée, chaque application ou utilisateur peut modifier ce paramètre à tout moment. SQL Server permet de modifier cette option de différentes façons. Par exemple, dans SQL Server Management Studio, l'option peut être définie dans une boîte de dialogue. Dans Transact-SQL, l'option peut être définie à différents niveaux au moyen de l'option SET QUOTED_IDENTIFIER, l'option QUOTED_IDENTIFIER de ALTER DATABASE ou l'option user options de la procédure stockée sp_configure.

Lorsque QUOTED_IDENTIFIER a la valeur ON, SQL Server suit les règles ISO concernant l'utilisation des guillemets et des guillemets simples (') dans les instructions SQL. Exemple :

  • Les guillemets peuvent être utilisés uniquement pour délimiter des identificateurs. Ils ne peuvent pas délimiter des chaînes de caractères.

    Afin de rester compatible avec les applications existantes, SQL Server n'applique pas entièrement cette règle. Les chaînes de caractères peuvent être encadrées par des guillemets si elles ne dépassent pas la longueur d'un identificateur. Cette pratique n'est pas recommandée.

  • Les guillemets simples doivent être utilisés pour encadrer des chaînes de caractères. Ils ne peuvent pas être utilisés pour délimiter des identificateurs.

    Si la chaîne de caractères contient un guillemet simple incorporé, insérez-en un second devant. Exemple :

    SELECT * FROM "My Table"
    WHERE "Last Name" = 'O''Brien';
    

Quand l'option QUOTED_IDENTIFIER a la valeur OFF, SQL Server utilise les règles suivantes pour les guillemets simples et les guillemets doubles :

  • Les guillemets ne peuvent pas être utilisés pour délimiter des identificateurs. Vous devez utiliser des crochets à la place.

  • Vous pouvez utiliser des guillemets simples ou des guillemets doubles pour encadrer des chaînes de caractères.

    Si les chaînes sont délimitées par des guillemets, il est inutile de doubler les guillemets simples imbriqués dans la chaîne. Exemple :

    SELECT * FROM [My Table]
    WHERE [Last Name] = "O'Brien";
    

Les délimiteurs entre crochets peuvent toujours être utilisés, quels que soient les paramètres de QUOTED_IDENTIFIER.

Règles pour délimiteurs et identificateurs

Règles relatives au format des identificateurs délimités :

  • Les identificateurs délimités peuvent contenir le même nombre de caractères que les identificateurs réguliers : de 1 à 128 caractères, sans compter les caractères de délimitation. Les identificateurs de tables temporaires locales peuvent contenir jusqu'à 116 caractères.

  • Le corps de l'identificateur peut contenir n'importe quelle combinaison de caractères dans la page de codes actuelle, à l'exception des caractères de délimitation proprement dits. Les identificateurs délimités peuvent ainsi contenir des espaces, n'importe quel caractère valide pour des identificateurs réguliers ainsi que n'importe lequel des caractères suivants :

    tilde (~)

    trait d'union (-)

    point d'exclamation (!)

    accolade gauche ({)

    pourcentage (%)

    accolade droite (})

    accent circonflexe (^)

    guillemet simple (')

    & (signe &)

    point (.)

    parenthèse gauche (()

    barre oblique inverse (\)

    parenthèse droite ())

    accent grave (`)

  • Si des identificateurs délimités sont utilisés dans le nom d'un objet contenant également des espaces, SQL Server stocke le nom avec les espaces. Notez que la sémantique utilisée pour comparer les noms d'identificateurs est la même que dans les comparaisons de chaînes. Par conséquent, les espaces de fin sont ignorés. Toutefois, pour éviter de futurs problèmes de compatibilité, nous vous conseillons de tenir compte de l'importance de chaque caractère qui constitue le délimiteur et de faire toujours référence à l'objet avec son nom d'identificateur délimité.

Les exemples suivants utilisent des identificateurs entre guillemets comme noms de colonnes et de tables. Les deux méthodes de spécification des identificateurs délimités sont illustrées ci-dessous.

SET QUOTED_IDENTIFIER ON;
GO
CREATE TABLE "$Employee Data"
(
 "^First Name"   varchar(25) NOT NULL,
 "^Last Name"   varchar(25) NOT NULL,
 "^Dept ID"   int
);
GO

-- INSERT statements go here.
SET QUOTED_IDENTIFIER OFF;
GO
CREATE TABLE [^$Employee Data]
(
 [^First Name]   varchar(25) NOT NULL,
 [^Last Name]   varchar(25) NOT NULL,
 [^Dept ID]   int
);
GO
-- INSERT statements go here.

Une fois que les tables $Employee Data et ^$Employee Data ont été créées et complétées, vous pouvez en extraire des lignes comme suit :

SET QUOTED_IDENTIFIER ON;
GO
SELECT * 
FROM "$Employee Data"
SET QUOTED_IDENTIFIER OFF;
GO
-- Or
SELECT *
FROM [^$Employee Data]

Dans l'exemple suivant, la table nommée table contient six colonnes : tablename, user, select, insert, update et delete. Comme TABLE, SELECT, INSERT, UPDATE et DELETE sont des mots clés réservés, les identificateurs doivent être délimités chaque fois que l'on accède aux objets.

SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE "table"
(
 tablename char(128) NOT NULL,
 "USER"    char(128) NOT NULL,
 "SELECT"  char(128) NOT NULL,
 "INSERT"  char(128) NOT NULL,
 "UPDATE"  char(128) NOT NULL,
 "DELETE"  char(128) NOT NULL
);
GO

Si l'option SET QUOTED_IDENTIFIER n'a pas la valeur ON, il est impossible d'accéder aux colonnes et à la table à moins d'utiliser les délimiteurs [ et ] : Exemple :

SET QUOTED_IDENTIFIER OFF;
GO
SELECT * 
FROM "table";
GO

Voici l'ensemble des résultats.:

Msg 170, Level 15, State 1
Line 1: Incorrect syntax near 'table'.

Le code suivant fonctionne grâce aux crochets :

SET QUOTED_IDENTIFIER OFF;
GO
SELECT * 
FROM [table];
GO

Identificateurs de délimitation en plusieurs parties

Lorsque vous utilisez un nom d'objet complet, vous pouvez être contraint de délimiter plusieurs des identificateurs qui le composent. Chaque identificateur doit être délimité séparément. Exemple :

/* ISO quoted identifier syntax */
SELECT *
FROM "My DB"."My#UserID"."My.Table";
GO

ou

/* Transact-SQL bracketed identifier syntax */
/* Not available in SQL Server 6.5 or earlier */
SELECT *
FROM [My DB].[My#UserID].[My.Table];
GO

Certaines règles particulières régissent la délimitation des noms de procédure stockée en plusieurs parties dans l'instruction ODBC CALL. Pour plus d'informations, consultez Appel d'une procédure stockée.

Utilisation d'identificateurs comme paramètres dans SQL Server

Beaucoup de procédures stockées du système, de fonctions et d'instructions DBCC prennent des noms d'objets comme paramètres. Certains de ces paramètres prennent des noms d'objets en plusieurs parties et d'autres des noms en une seule partie. Le fait d'utiliser un nom en une seule ou en plusieurs parties détermine l'analyse de ce paramètre et son utilisation interne par SQL Server.

Noms de paramètre en une seule partie

Si le paramètre est un identificateur en une seule partie, le nom peut être spécifié :

  • sans guillemets ni délimiteurs ;

  • délimité par des guillemets simples ;

  • délimité par des guillemets doubles ;

  • délimité par des crochets.

Dans le cas des noms en une seule partie, la chaîne à l'intérieur des guillemets simples représente le nom d'objet. Si des délimiteurs sont utilisés à l'intérieur de guillemets simples, les caractères de délimitation sont traités comme faisant partie du nom.

Si le nom contient un point ou tout autre caractère ne faisant pas partie du jeu de caractères défini pour les identificateurs réguliers, vous devez mettre le nom d'objet entre des guillemets simples, des guillemets doubles ou des crochets.

Noms de paramètres en plusieurs parties

Les noms de paramètres en plusieurs parties sont des noms complets qui incluent le nom de la base de données ou du schéma en plus du nom de l'objet. SQL Server exige que, lorsqu'un nom en plusieurs parties est utilisé comme paramètre, l'intégralité de la chaîne qui constitue le nom en plusieurs parties soit mis entre guillemets simples.

EXEC MyProcedure @name = 'dbo.Employees';

Si les différentes parties du nom doivent être délimitées, chacune d'entre elles doit l'être séparément, en fonction des besoins. Si une partie du nom contient un point, un guillemet double ou un crochet gauche ou droit, vous devrez donc utiliser des crochets ou des guillemets doubles pour la délimiter. Mettez le nom complet entre guillemets simples.

Par exemple, la table nommée tab.one contient un point. Pour éviter que son nom ne soit interprété comme un nom en trois parties, dbo.tab.one, délimitez la partie du nom de la table.

EXEC sp_help 'dbo.[tab.one]';

L'exemple suivant montre le même nom de table délimité par des guillemets doubles :

SET QUOTED_IDENTIFIER ON; 
GO 
EXEC sp_help 'dbo."tab.one"';
GO 

Historique des modifications

Mise à jour du contenu

Correction de l'instruction sous « Règles pour identificateurs délimités » pour indiquer que les espaces de fin sont stockés avec les noms des objets et ajout d'une méthode recommandée lors de l'utilisation de noms d'objets délimités.