Identificatori delimitati (Motore di database)

Un identificatore conforme alle regole relative al formato degli identificatori può essere utilizzato con o senza delimitatori. Un identificatore non conforme a queste regole deve essere sempre delimitato.

[!NOTA]

MicrosoftSQL Server non riconosce nomi di variabili e parametri di stored procedure delimitati. È necessario che tali tipi di identificatori soddisfino le regole relative ai normali identificatori.

Gli identificatori delimitati vengono utilizzati nelle situazioni seguenti:

  • Quando si utilizzano parole riservate per i nomi di oggetto o parti di nomi di oggetto.

    È consigliabile non utilizzare parole chiave riservate come nomi di oggetto. I database che vengono aggiornati da versioni precedenti di SQL Server potrebbero includere identificatori composti da parole che, pur non essendo riservate nella versione precedente, lo sono nella versione corrente di SQL Server. È possibile fare riferimento a tali oggetti utilizzando identificatori delimitati fino a quando non risulta possibile modificarne il nome.

  • Quando si utilizzano caratteri diversi dagli identificatori qualificati.

    In SQL Server è possibile utilizzare come identificatore delimitato qualsiasi carattere della tabella codici corrente. Un uso indiscriminato di caratteri speciali all'interno dei nomi di oggetto può tuttavia rendere più difficile la lettura e la gestione di istruzioni e script SQL. Ad esempio, è possibile creare una tabella con nome Employee], dove la parentesi quadra di chiusura fa parte del nome. A tale scopo, è necessario utilizzare caratteri di escape per la parentesi quadra di chiusura, specificando altre due parentesi quadre, come illustrato di seguito:

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

[!NOTA]

I delimitatori vengono utilizzati solo con gli identificatori. Non sono invece utilizzabili con le parole chiave, anche se sono contrassegnati come riservati in SQL Server.

Tipi di delimitatori

Di seguito sono riportati i tipi di delimitatori utilizzati in Transact-SQL:

  • Identificatori tra virgolette doppie ("):

    SELECT * FROM "Blanks in Table Name";
    
  • Identificatori tra parentesi quadre ([ ]):

    SELECT * FROM [Blanks In Table Name];
    

Gli identificatori tra virgolette sono validi solo quando l'opzione QUOTED_IDENTIFIER è impostata su ON. Per impostazione predefinita, il provider OLE DB per SQL Server e SQL Server e il driver ODBC di SQL Server attivano l'opzione QUOTED_IDENTIFIER al momento della connessione.

Indipendentemente dall'interfaccia utilizzata, questa impostazione può essere modificata dai singoli utenti e nelle singole applicazioni in qualsiasi momento. In SQL Server è possibile specificare questa opzione in diversi modi. Ad esempio, in SQL Server Management Studio è possibile impostare l'opzione in una finestra di dialogo. In Transact-SQL l'opzione può essere impostata a vari livelli utilizzando SET QUOTED_IDENTIFIER, l'opzione QUOTED_IDENTIFIER di ALTER DATABASE oppure l'opzione user options di sp_configure.

Quando l'opzione QUOTED_IDENTIFIER è attivata, in SQL Server vengono seguite le regole ISO per l'utilizzo delle virgolette doppie (") e singole (') all'interno delle istruzioni SQL. Ad esempio:

  • Le virgolette doppie possono essere utilizzate per delimitare solo gli identificatori, non le stringhe di caratteri.

    Per mantenere la compatibilità con le applicazioni esistenti,SQL Serverquesta regola non viene applicata completamente. Se la lunghezza della stringa non è superiore a quella dell'identificatore, è possibile racchiudere le stringhe di caratteri tra virgolette doppie. È tuttavia consigliabile non adottare questa tecnica.

  • Le stringhe di caratteri devono essere racchiuse tra virgolette singole, le quali non sono utilizzabili per la delimitazione degli identificatori.

    Se la stringa di caratteri include già una virgoletta singola, è consigliabile inserire una seconda virgoletta singola davanti a quella che fa parte del testo. Ad esempio:

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

Quando l'opzione QUOTED_IDENTIFIER è disattivata, in SQL Server vengono adottate le regole seguenti per le virgolette singole e doppie:

  • Per delimitare gli identificatori non è consentito utilizzare le virgolette doppie. È invece necessario utilizzare le parentesi.

  • Le stringhe di caratteri devono essere racchiuse tra virgolette singole o doppie.

    Se si utilizzano le virgolette doppie, non è necessario contrassegnare le virgolette singole incorporate con due virgolette singole. Ad esempio:

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

I delimitatori tra parentesi quadre sono sempre utilizzabili, indipendentemente dall'impostazione di QUOTED_IDENTIFIER.

Regole relative agli identificatori delimitati

Di seguito sono riportate alcune regole relative al formato degli identificatori delimitati.

  • Gli identificatori delimitati possono essere composti dallo stesso numero di caratteri degli identificatori regolari, ovvero da 1 a 128 caratteri, esclusi i caratteri di delimitazione. Gli identificatori delle tabelle temporanee locali possono includere al massimo 116 caratteri.

  • Il corpo dell'identificatore può includere qualsiasi combinazione di caratteri della tabella codici corrente, ad eccezione dei caratteri di delimitazione. Ad esempio, gli identificatori delimitati possono includere spazi, i caratteri validi per gli identificatori regolari e i caratteri riportati di seguito.

    ~ (tilde)

    - (trattino)

    ! (punto esclamativo)

    { (parentesi graffa aperta)

    % (percento)

    } (parentesi graffa chiusa)

    ^ (accento circonflesso)

    ' (apostrofo)

    & (e commerciale)

    . (punto)

    ( (parentesi aperta)

    \ (barra rovesciata)

    ) (parentesi chiusa)

    ` (accento grave)

  • Se si utilizzano gli identificatori delimitati quando si rinomina un oggetto e il nome dell'oggetto include spazi finali, il nome viene archiviato in SQL Server con gli spazi finali. Si noti che la semantica utilizzata per confrontare i nomi degli identificatori è analoga a quella dei confronti tra stringhe. Pertanto, gli spazi finali vengono ignorati. Tuttavia, per evitare problemi di compatibilità con le versioni future, è consigliabile considerare significativo qualsiasi carattere all'interno del delimitatore e fare riferimento in modo coerente all'oggetto con il nome dell'identificatore delimitato.

Negli esempi seguenti vengono utilizzati identificatori tra virgolette per i nomi di tabella e di colonna. Di seguito vengono illustrati entrambi i metodi disponibili per specificare gli identificatori delimitati:

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.

Dopo la creazione delle tabelle $Employee Data e ^$Employee Data e l'immissione dei dati, è possibile recuperare le righe, come riportato di seguito.

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

Nell'esempio seguente una tabella denominata table include le colonne tablename, user, select, insert, update e delete. Poiché TABLE, SELECT, INSERT, UPDATE e DELETE sono parole chiave riservate, è necessario che gli identificatori vengano delimitati ogni volta che si accede agli oggetti.

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

Se l'opzione SET QUOTED_IDENTIFIER non è attivata, è possibile accedere alle tabelle e alle colonne solo se si utilizzano come delimitatori le parentesi quadre. Ad esempio:

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

Set di risultati::

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

Il corretto funzionamento dell'esempio seguente dipende dall'utilizzo delle parentesi come delimitatori:

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

Identificatori delimitati composti da più parti

Quando si utilizzano nomi di oggetti qualificati può essere necessario delimitare più identificatori che compongono il nome dell'oggetto. Ogni identificatore deve essere delimitato singolarmente. Ad esempio:

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

oppure

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

Quando si delimitano nomi di stored procedure composti da più parti nell'istruzione ODBC CALL, è necessario rispettare regole specifiche. Per ulteriori informazioni, vedere Chiamata di una stored procedure.

Utilizzo di identificatori come parametri in SQL Server

Molte stored procedure di sistema, funzioni e istruzioni DBCC accettano come parametri i nomi di oggetto. Alcuni di questi parametri accettano nomi di oggetto composti da più parti, mentre altri accettano solo nomi costituiti da una sola parte. La modalità di analisi e di utilizzo di un parametro in SQL Server varia a seconda che sia previsto un nome composto da una o più parti.

Nomi di parametro costituiti da una sola parte

Se il parametro è rappresentato da un identificatore costituito da una sola parte, è possibile specificare il nome nei modi seguenti:

  • Senza virgolette o delimitatori

  • Racchiuso tra virgolette singole

  • Racchiuso tra virgolette doppie

  • Racchiuso tra parentesi quadre

Nel caso dei nomi costituiti da una sola parte, la stringa racchiusa tra virgolette singole rappresenta il nome dell'oggetto. Se i delimitatori vengono racchiusi tra virgolette singole, i caratteri di delimitazione vengono considerati parte del nome.

Se il nome include un punto o un altro carattere che non fa parte del set di caratteri definito per gli identificatori regolari, è necessario racchiudere il nome dell'oggetto tra virgolette singole, virgolette doppie o parentesi quadre.

Nomi di parametri composti da più parti

I nomi composti da più parti sono nomi qualificati che, oltre al nome dell'oggetto, includono il nome dello schema o del database. Quando un nome di questo tipo viene utilizzato come parametro, in SQL Server è necessario che l'intera stringa che lo rappresenta sia racchiusa tra virgolette singole.

EXEC MyProcedure @name = 'dbo.Employees';

Se per singole parti del nome è necessario utilizzare delimitatori, ogni parte deve essere delimitata separatamente. Se, ad esempio, una parte di un nome include un punto, una virgoletta doppia oppure una parentesi aperta o chiusa, è necessario racchiuderla tra parentesi quadre o virgolette doppie. Il nome completo deve essere racchiuso tra virgolette singole.

Ad esempio, il nome di tabella tab.one include un punto. Per evitare che il nome venga considerato un nome composto da tre parti, ovvero dbo.tab.one, delimitare la parte del nome della tabella.

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

Nell'esempio seguente viene riportato lo stesso nome di tabella delimitato con virgolette doppie.

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

Cronologia modifiche

Aggiornamento del contenuto

Corretta l'istruzione in "Regole relative agli identificatori delimitati" per indicare che gli spazi finali vengono archiviati con i nomi degli oggetti e aggiunta una procedura consigliata quando si utilizzano i nomi degli oggetti delimitati.