Identificadores delimitados (motor de base de datos)

Si un identificador cumple todas las reglas de formato de los identificadores, se puede utilizar con o sin delimitadores. Si un identificador no cumple las reglas de formato de los identificadores normales, debe aparecer siempre delimitado.

[!NOTA]

MicrosoftSQL Server no reconoce los nombres de variable y los parámetros de procedimientos almacenados que están delimitados. Este tipo de identificadores debe cumplir las reglas de formato de los identificadores normales.

Los identificadores delimitados se utilizan en estas situaciones:

  • Cuando las palabras reservadas se usan para los nombres de objeto o partes de los nombres de objeto.

    Se recomienda que no utilice palabras reservadas como nombres de objeto. Las bases de datos actualizadas a partir de versiones anteriores de SQL Server pueden contener identificadores que incluyen palabras que no estaban reservadas en la versión anterior, pero que sí lo están en la versión actual de SQL Server. Puede hacer referencia al objeto con identificadores delimitados hasta que se pueda cambiar el nombre.

  • Cuando use caracteres no enumerados como identificadores calificados.

    SQL Server permite que se utilice como identificador delimitado cualquier carácter de la página de códigos actual. No obstante, el uso indiscriminado de caracteres especiales en los nombres de objeto puede hacer que las instrucciones y scripts de SQL resulten difíciles de leer y de mantener. Por ejemplo, puede crear una tabla con el nombre Employee], en el que el corchete forma parte del nombre. Para ello, debe definir el corchete como carácter de escape mediante dos o más corchetes, tal como se indica a continuación:

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

[!NOTA]

Los delimitadores sólo pueden utilizarse para identificadores. No es posible utilizar delimitadores para palabras clave, aunque estén marcadas como reservadas en SQL Server.

Tipos de delimitadores

A continuación se indican los tipos de delimitadores utilizados en Transact-SQL:

  • Los identificadores entrecomillados aparecen delimitados por comillas dobles ("):

    SELECT * FROM "Blanks in Table Name";
    
  • Los identificadores entre corchetes aparecen delimitados por corchetes ([ ]):

    SELECT * FROM [Blanks In Table Name];
    

Los identificadores entre comillas dobles sólo son válidos si la opción QUOTED_IDENTIFIER es ON. De forma predeterminada, el proveedor OLE DB de Microsoft para SQL Server y el controlador ODBC de SQL Server establecen la opción QUOTED_IDENTIFIER en ON cuando se conectan.

Independientemente de la interfaz utilizada, las aplicaciones o los usuarios individuales pueden cambiar la configuración en cualquier momento. SQL Server permite especificar esta opción de varias formas. Por ejemplo, en SQL Server Management Studio, se puede establecer en un cuadro de diálogo. En Transact-SQL, se puede configurar en varios niveles con SET QUOTED_IDENTIFIER, la opción QUOTED_IDENTIFIER de ALTER DATABASE, o la opción de usuario sp_configure.

Cuando el valor de la opción QUOTED_IDENTIFIER está establecido en ON, SQL Server sigue las reglas ISO para el uso de las comillas dobles ("), mientras que utiliza las comillas simples (') en las instrucciones SQL. Por ejemplo:

  • Las comillas dobles se pueden usar sólo para delimitar identificadores. No se pueden utilizar para delimitar cadenas de caracteres.

    Para mantener la compatibilidad con las aplicaciones existentes, SQL Server no exige el cumplimiento de esta regla. Las cadenas de caracteres se pueden delimitar con comillas dobles si no exceden la longitud de un identificador, aunque esta práctica no se recomienda.

  • Las comillas simples se deben utilizar para delimitar cadenas de caracteres. No se pueden utilizar para delimitar identificadores.

    Si la cadena de caracteres contiene una comilla simple incrustada, inserte una comilla simple adicional delante de la comilla incrustada. Por ejemplo:

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

Cuando el valor de QUOTED_IDENTIFIER es OFF, SQL Server utiliza las siguientes reglas relativas al uso de las comillas dobles y simples:

  • Las comillas dobles no se pueden utilizar para delimitar identificadores. En su lugar, utilice corchetes como delimitadores.

  • Para delimitar cadenas de caracteres se pueden utilizar comillas simples o dobles.

    Si se utilizan comillas dobles, las comillas simples incrustadas no tienen que estar delimitadas por dos comillas simples: Por ejemplo:

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

Los delimitadores entre corchetes siempre pueden utilizarse, independientemente de la configuración de QUOTED_IDENTIFIER.

Reglas para los identificadores delimitados

Las reglas del formato de los identificadores delimitados son las siguientes:

  • Los identificadores delimitados pueden contener el mismo número de caracteres que los identificadores normales: de 1 a 128 caracteres, sin incluir los caracteres delimitadores Los identificadores locales de tablas temporales pueden tener un máximo de 116 caracteres.

  • La parte de cuerpo del identificador puede contener cualquier combinación de caracteres de la página actual de códigos, excepto los propios caracteres delimitadores. Por ejemplo, los identificadores delimitados pueden contener espacios, cualquier carácter válido para los identificadores normales y cualquiera de los siguientes caracteres.

    tilde (~)

    guión (-)

    signo de exclamación de cierre (!)

    llave de apertura ({)

    porcentaje (%)

    llave de cierre (})

    símbolo de intercalación (^)

    apóstrofo (')

    y comercial (&)

    punto (.)

    paréntesis de apertura (()

    barra diagonal inversa (\)

    paréntesis de cierre ())

    acento grave (`)

  • Si se utilizan identificadores delimitados para asignar un nombre a un objeto y éste incluye espacios finales, SQL Server almacenará el nombre con los espacios. Observe que la semántica utilizada para comparar los nombres de identificador es igual que en las comparaciones de cadenas. Por consiguiente, se omiten los espacios finales. Sin embargo, para evitar problemas de compatibilidad futuros, recomendamos que dé importancia a todos los caracteres que estén dentro del delimitador y que siempre haga referencia al objeto mediante su nombre de identificador delimitado.

En los siguientes ejemplos se utilizan identificadores entre comillas para los nombres de las columnas y de la tablas. Se emplean ambos métodos para especificar los identificadores delimitados en los casos siguientes:

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.

Después de haber creado las tablas $Employee Data y ^$Employee Data y de haber especificado los datos, se pueden recuperar las filas tal como se indica a continuación:

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

En el ejemplo siguiente, una tabla con el nombre table incluye las columnas tablename, user, select, insert, update y delete. Puesto que TABLE, SELECT, INSERT, UPDATE y DELETE son palabras clave reservadas, los identificadores deben delimitarse cada vez que se tenga acceso a los objetos.

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 la opción SET QUOTED_IDENTIFIER no es ON (activada), no se podrá tener acceso a las columnas ni a la tabla a menos que se utilicen los delimitadores de corchete ([ y ]): Por ejemplo:

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

Éste es el conjunto de resultados.:

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

El caso siguiente funciona gracias a los delimitadores de corchete:

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

Delimitar identificadores con varias partes

Cuando se utilizan nombres de objetos completos, puede delimitar uno o varios de los identificadores que forman el nombre del objeto. Cada identificador se debe delimitar individualmente Por ejemplo:

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

O bien

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

En la instrucción ODBC CALL existen algunas reglas especiales sobre cómo tiene que delimitar nombres de procedimientos almacenados de varias partes. Para obtener más información, vea Llamar a un procedimiento almacenado.

Usar identificadores como parámetros de SQL Server

Muchos procedimientos almacenados del sistema, funciones e instrucciones DBCC toman nombres de objeto como parámetros. Algunos parámetros aceptan nombres de objeto formados por varias partes, mientras que otros sólo admiten nombres formados por una única parte. El hecho de que un parámetro espere un nombre de una sola parte o de varias determina la forma en que SQL Server analiza y utiliza internamente el parámetro.

Nombres de parámetro de una sola parte

Si el parámetro es un identificador de una sola parte, el nombre se puede especificar de los modos siguientes:

  • Sin comillas dobles o delimitadores

  • Entre comillas simples

  • Entre comillas dobles

  • Entre corchetes

Para los nombres de una sola parte, la cadena que se encuentra entre las comillas simples representa el nombre del objeto. Si los delimitadores se utilizan entre comillas simples, los caracteres delimitadores se tratan como parte del nombre.

Si el nombre contiene un punto o cualquier otro carácter que no sea parte del conjunto de caracteres definido para los identificadores normales, el nombre del objeto debe incluirse entre comillas simples, comillas dobles o corchetes.

Nombres de parámetros formados por varias partes

Los nombres de parámetros formados por varias partes son nombres completos que incluyen el nombre de la base de datos o del esquema además del nombre del objeto. Cuando se utiliza como parámetro un nombre con varias partes, SQL Server requiere que la cadena completa que lo constituye se escriba entre comillas simples.

EXEC MyProcedure @name = 'dbo.Employees';

Si hubiera que delimitar las partes individuales del nombre, cada parte se delimitaría por separado, como fuese necesario. Por ejemplo, si una parte del nombre contiene un punto, comillas dobles o bien corchetes de apertura o cierre, utilice corchetes o comillas dobles para delimitar el componente. El nombre completo debe incluirse entre comillas simples.

Por ejemplo, el nombre de tabla tab.one contiene un punto. Para evitar que el nombre se interprete como un nombre de tres partes, dbo.tab.one, delimite la parte del nombre de tabla.

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

En el ejemplo siguiente se muestra el mismo nombre de tabla delimitado con comillas dobles:

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

Historial de cambios

Contenido actualizado

Se ha corregido la instrucción de "Reglas para que Identificadores delimitado" para indicar que los espacios finales se almacenan con los nombres de objeto y se ha agregado una recomendación para utilizar nombres de objeto delimitados.