Identificadores delimitados (Mecanismo de Banco de Dados)

Um identificador que está de acordo com todas as regras do formato de identificadores pode ser utilizado com ou sem delimitadores. Um identificador que não está de acordo com as regras do formato de identificadores regulares sempre deve ser delimitado.

ObservaçãoObservação

O MicrosoftSQL Server não reconhece nomes de variáveis e parâmetros de procedimento armazenado que são delimitados. Estes tipos de identificadores devem obedecer às regras para identificadores regulares.

Os identificadores delimitados são utilizados nas seguintes situações:

  • Quando palavras reservadas são utilizadas para nomes de objeto ou partes de nomes de objeto.

    Palavras-chave reservadas não deverão ser utilizadas como nomes de objetos. Bancos de dados atualizados de versões mais antigas do SQL Server podem conter identificadores que incluem palavras não-reservadas na versão anterior, mas que são palavras reservadas para a versão atual do SQL Server. Você pode consultar o objeto utilizando identificadores delimitados até que o nome possa ser alterado.

  • Quando você está utilizando caracteres que não são listados como identificadores qualificados.

    O SQL Server permite que qualquer caractere na página de código atual possa ser utilizado em um identificador delimitado. Porém, a utilização indiscriminada de caracteres especiais em um nome de objeto pode tornar as instruções e os scripts SQL difíceis de ler e manter. Por exemplo, você pode criar uma tabela com o nome Employee], onde o colchete final faz parte do nome. Para fazer isso, você deve incluir o colchete final utilizando dois colchetes a mais como mostrado abaixo:

    CREATE TABLE [Employee]]] 
    (
    EmployeeID int IDENTITY (1,1) NOT NULL,
    FirstName varchar(30),
    LastName varchar(30)
    );
    
ObservaçãoObservação

Delimitadores são apenas para identificadores. Os delimitadores não podem ser utilizados para palavras-chave, mesmo se forem marcados como reservados no SQL Server.

Tipos de delimitadores

Veja os seguintes tipos de delimitadores utilizados no Transact-SQL:

  • Os identificadores entre aspas são delimitados por meio de aspas duplas ("):

    SELECT * FROM "Blanks in Table Name";
    
  • Identificadores entre parênteses são delimitados por parênteses ([ ]):

    SELECT * FROM [Blanks In Table Name];
    

Identificadores entre aspas são válidos somente quando a opção QUOTED_IDENTIFIER é definida como ON. Por padrão, o Provedor OLE DB da Microsoft para o driver ODBC do SQL Server e do SQL Server definiu QUOTED_IDENTIFIER como ON quando eles são conectados.

Seja qual for a interface utilizada, os aplicativos individuais ou usuários podem alterar a configuração a qualquer momento. O SQL Server fornece várias maneiras para especificar essa opção. Por exemplo, em SQL Server Management Studio, a opção pode ser definida em uma caixa de diálogo. No Transact-SQL, a opção pode ser definida em vários níveis utilizando SET QUOTED_IDENTIFIER, a opção QUOTED_IDENTIFIER de ALTER DATABASE ou a opção user options de sp_configure.

Quando QUOTED_IDENTIFIER é definido como ON, o SQL Server segue as regras ISO para utilização de aspas duplas (") e aspas simples (') nas instruções SQL. Por exemplo:

  • As aspas duplas só podem ser utilizadas para delimitar identificadores. Elas não podem ser utilizadas para delimitar cadeias de caracteres.

    Para manter compatibilidade com aplicativos existentes, o SQL Server não impõe essa regra completamente. As cadeias de caracteres poderão ser incluídas em aspas duplas se a cadeia de caracteres não exceder o comprimento de um identificador. Nós não recomendamos essa prática.

  • Para incluir cadeias de caracteres deverão ser utilizadas aspas simples. Elas não podem ser utilizadas para delimitar identificadores.

    Se a cadeia de caracteres contiver uma aspa simples incorporada, você deverá inserir uma aspa simples adicional na frente da marca incorporada. Por exemplo:

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

Quando QUOTED_IDENTIFIER é definido como OFF, o SQL Server utiliza as seguintes regras para aspas simples e duplas:

  • As aspas simples não podem ser utilizadas para delimitar identificadores. Em vez disso, devem ser utilizados parênteses como delimitadores.

  • Para incluir cadeias de caracteres poderão ser utilizadas aspas simples ou duplas.

    Se forem utilizadas aspas duplas, as aspas simples incorporadas não precisarão ser denotadas por duas aspas simples. Por exemplo:

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

Os delimitadores entre parênteses sempre poderão ser utilizados, seja qual for a configuração de QUOTED_IDENTIFIER.

Regras para identificadores delimitados

As regras para o formato de identificadores delimitados incluem o seguinte:

  • Identificadores delimitados podem conter o mesmo número de caracteres que os identificadores regulares. Isso pode ser de 1 a 128 caracteres, não incluindo os caracteres do delimitador. Identificadores de tabela temporários locais podem ter no máximo 116 caracteres.

  • O corpo do identificador pode conter qualquer combinação de caracteres na página de código atual, exceto os próprios caracteres de delimitação. Por exemplo, os identificadores delimitados podem conter espaços, qualquer caractere válido para identificadores regulares, e qualquer um dos seguintes caracteres.

    til (~)

    hífen (-)

    ponto de exclamação (!)

    chave esquerda ({)

    porcento (%)

    chave direita (})

    sinal de intercalação (^)

    apóstrofe (')

    E comercial (&)

    ponto (.)

    parêntese esquerdo (()

    barra invertida (\)

    parêntese direito (()

    acento grave (')

  • Se os identificadores delimitados forem utilizados para nomear um objeto e o nome de objeto contiver espaços à direita, o SQL Server armazenará o nome com os espaços à direita. Observe que a semântica usada para comparar nomes de identificadores é igual à de comparações de cadeias de caracteres. Portanto, os espaços à direita são ignorados. Entretanto, para evitar problemas de compatibilidade futuros, é recomendável que você considere qualquer caractere dentro do delimitador significativo e que referencie o objeto com seu nome de identificador delimitado de forma consistente.

Os exemplos abaixo utilizam identificadores entre aspas para nomes de tabelas e nomes de colunas. A seguir são mostrados os dois métodos para especificar identificadores delimitados:

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.

Depois que as tabelas $Employee Data e ^$Employee Data foram criadas e os dados inseridos, as linhas poderão ser recuperadas como mostrado abaixo:

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

No exemplo abaixo, uma tabela nomeada table contém as colunas tablename, user, select, insert, updatee delete. Como TABLE, SELECT, INSERT, UPDATE e DELETE são palavras-chave reservadas, os identificadores devem ser delimitados sempre os objetos são acessados.

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 a opção de SET QUOTED_IDENTIFIER não estiver ON, a tabela e as colunas não poderão ser acessadas a menos que sejam utilizados delimitadores de parêntese. Por exemplo:

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

Conjunto de resultados.:

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

O exemplo a seguir funciona por causa dos delimitadores de parênteses:

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

Identificadores delimitados com várias partes

Quando você estiver usando nomes de objeto qualificados, você pode ter que delimitar mais que um dos identificadores que compõem o nome de objeto. Cada identificador deve ser delimitado individualmente. Por exemplo:

/* 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

Há algumas regras especiais relacionadas à forma de delimitar nomes de procedimentos armazenados com várias partes na instrução ODBC CALL. Para obter mais informações, consulte Chamando um procedimento armazenado.

Utilização de identificadores como parâmetros no SQL Server

Muitos procedimentos de sistema armazenados, funções e instruções DBCC possuem nomes de objetos como parâmetros. Alguns desses parâmetros aceitam nomes de objeto de várias partes, enquanto outros só aceitam nomes com uma parte. Se for esperado um nome de uma parte ou de várias partes, isso determina como um parâmetro é analisado gramaticalmente e utilizado internamente pelo SQL Server.

Nomes de parâmetro com uma parte

Se o parâmetro for um identificador de uma parte, o nome poderá ser especificado das seguintes formas:

  • Sem aspas ou delimitadores

  • Entre aspas simples

  • Entre aspas duplas

  • Entre parênteses

Para nomes de uma parte, a cadeia de caracteres entre as aspas simples representa o nome do objeto. Se forem utilizados delimitadores dentro das aspas simples, os caracteres do delimitador serão tratados como parte do nome.

Se o nome contiver um ponto ou outro caractere que não faça parte do conjunto de caracteres definidos para identificadores regulares, você deverá colocar o nome do objeto entre aspas simples, aspas duplas ou parênteses.

Nomes de parâmetro com várias partes

Nomes com várias partes são nomes qualificados que incluem nome do banco de dados ou do esquema e também o nome do objeto. Quando um nome com várias partes for utilizado como um parâmetro, o SQL Server exigirá que toda a cadeia de caracteres que compõe o nome com várias partes seja colocada entre um conjunto de aspas simples.

EXEC MyProcedure @name = 'dbo.Employees';

Se partes específicas do nome necessitar de delimitadores, cada parte do nome deverá ser delimitado separadamente conforme a necessidade. Por exemplo, se uma parte do nome contiver um ponto, aspa dupla ou um parêntese à esquerda ou à direita, utilize parênteses ou aspas duplas para delimitar a parte. Coloque o nome completo entre aspas simples.

Por exemplo, o nome de tabela, tab.one, contém um ponto. Para evitar que o nome seja interpretado como um nome de três partes, dbo.tab.one, delimite a parte do nome da tabela.

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

O exemplo abaixo mostra o mesmo nome de tabela delimitado com aspas duplas:

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

Histórico de alterações

Conteúdo atualizado

Corrigida a instrução sob "Regras para identificadores delimitados" para indicar que os espaços à direita são armazenados com nomes de objeto e adicionada uma prática recomendada para o uso de nomes de objetos delimitados.