Идентификаторы с разделителями (компонент Database Engine)

Идентификатор, соответствующий всем правилам формата идентификаторов, может использоваться как с разделителями, так и без них. Идентификаторы, не соответствующие правилам формата обычных идентификаторов, всегда необходимо использовать с разделителями.

ПримечаниеПримечание

Microsoft SQL Server не распознает имена переменных и параметров хранимых процедур, заключенные в разделители. Эти типы идентификаторов должны соответствовать правилам для обычных идентификаторов.

Идентификаторы с разделителями используются в следующих ситуациях:

  • При использовании зарезервированных слов для имен объектов или частей имен объектов.

    Зарезервированные ключевые слова нельзя использовать в качестве имен объекта. Базы данных, обновленные с более ранних версий SQL Server, могут содержать идентификаторы со словами, которые не были зарезервированными словами в прежней версии, но зарезервированы в SQL Server. Пока имя не будет изменено, можно ссылаться на объект с помощью идентификаторов с разделителями.

  • При использовании символов, которые не перечислены как уточненные идентификаторы.

    SQL Server позволяет использовать любой символ в текущей кодовой странице в идентификаторе с разделителем. Однако беспорядочное использование специальных символов в имени объекта может сделать инструкции SQL и сценарии трудными для чтения и обслуживания. Например, можно создать таблицу с именем Employee], где заключительная квадратная скобка — часть имени. Чтобы сделать это, необходимо экранировать заключительную квадратную скобку с помощью двух квадратных скобок, как показано далее:

    CREATE TABLE [Employee]]] 
    (
    EmployeeID int IDENTITY (1,1) NOT NULL,
    FirstName varchar(30),
    LastName varchar(30)
    )
    
ПримечаниеПримечание

Разделители используются только для идентификаторов. Разделители не могут использоваться для ключевых слов, даже если они отмечены как зарезервированные в SQL Server.

Типы разделителей, используемых в языке Transact-SQL:

  • Заключенные в кавычки идентификаторы разделяются двойными кавычками ("):

    SELECT * FROM "Blanks in Table Name"
    
  • Заключенные в скобки идентификаторы разделяются скобками ([ ]):

    SELECT * FROM [Blanks In Table Name]
    

Заключенные в кавычки идентификаторы допустимы, только если параметр QUOTED_IDENTIFIER установлен в ON. По умолчанию поставщик Microsoft OLE DB для SQL Server и драйвер ODBC SQL Server устанавливают параметр QUOTED_IDENTIFIER в состояние ON при подключении.

Независимо от используемого интерфейса, отдельные приложения или пользователи могут изменить эту настройку в любое время. SQL Server обеспечивает несколько способов для указания этого параметра. Например, в среде Среда SQL Server Management Studio параметр может быть установлен в диалоговом окне. В языке Transact-SQL параметр может быть установлен на различных уровнях с помощью инструкции SET QUOTED_IDENTIFIER, параметра QUOTED_IDENTIFIER инструкции ALTER DATABASE или аргумента user options процедуры sp_configure.

Когда параметр QUOTED_IDENTIFIER равен ON, приложение SQL Server следует правилам ISO по использованию двойных кавычек (") и одиночной кавычки (') в инструкциях SQL. Например:

  • Двойные кавычки могут использоваться только для выделения идентификаторов. Они не могут использоваться для выделения строк символов.

    Чтобы обеспечить совместимость с существующими приложениями, SQL Server не полностью следует этому правилу. Строки символов могут быть заключены в двойные кавычки, если строка не превышает длину идентификатора. Не рекомендуется использовать эту возможность.

  • Одиночные кавычки должны использоваться для заключения в них строк символов. Они не могут использоваться для выделения идентификаторов.

    Если строка символов содержит внедренную одиночную кавычку, необходимо вставить дополнительную одиночную кавычку перед внедренной кавычкой. Например:

    SELECT * FROM "My Table"
    WHERE "Last Name" = 'O''Brien'
    
ПримечаниеПримечание

Если идентификаторы с разделителями используются при присвоении имени объекту и имя объекта содержит конечные пробелы, SQL Server сохранит имя без конечных пробелов.

Если параметр QUOTED_IDENTIFIER установлен в OFF, SQL Server использует следующие правила для одиночных и двойных кавычек:

  • Кавычки не могут использоваться для выделения идентификаторов. Вместо этого в качестве разделителей должны использоваться скобки.

  • Одинарные или двойные кавычки могут использоваться для заключения в них строк символов.

    Если используются двойные кавычки, внедренные одиночные кавычки не должны быть обозначены двумя одиночными кавычками. Например:

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

Разделители в скобках могут использоваться всегда, независимо от настройки QUOTED_IDENTIFIER.

Правила для идентификаторов с разделителями

Правила для формата идентификаторов с разделителями следующие.

  • Идентификаторы с разделителями могут содержать то же количество символов, что и обычные идентификаторы. Это может быть от 1 до 128 символов, не включая символы-разделители. Идентификаторы локальных временных таблиц могут быть максимум 116 символов.

  • Текст идентификатора может содержать любую комбинацию символов в текущей кодовой странице, кроме непосредственно разграничивающих символов. Например, идентификаторы с разделителями могут содержать пробелы, любые символы, допустимые для обычных идентификаторов, и любой из следующих символов.

    тильда (~)

    дефис (-)

    восклицательный знак (!)

    левая фигурная скобка ({)

    знак процента (%)

    правая фигурная скобка (})

    знак вставки (^)

    апостроф (')

    амперсанд (&)

    точка (.)

    левая круглая скобка (()

    обратная косая черта (\)

    правая круглая скобка ())

    знак ударения (`)

Указанные ниже примеры используют заключенные в кавычки идентификаторы для имен таблиц и имен столбцов. Вот два способа указания идентификаторов с разделителями:

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.

После того как таблицы $Employee Data и ^$Employee Data созданы и данные введены, строки могут быть извлечены, как показано далее:

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

В следующем примере таблица по имени table содержит столбцы tablename, user, select, insert, update и delete. Поскольку TABLE, SELECT, INSERT, UPDATE и DELETE — это зарезервированные ключевые слова, идентификаторы должны быть заключены в символы-разделители при каждом обращении к объекту.

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

Если параметр SET QUOTED_IDENTIFIER не установлен в состояние ON, к таблице и столбцам нельзя обратиться, если не использовать разделители-скобки. Например:

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

Ниже приводится результирующий набор.:

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

Следующий пример работает из-за разделителей-скобок:

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

Идентификаторы-разделители с несколькими частями

При использовании уточненных имен объектов можно заключить в разделители больше, чем один из идентификаторов, составляющих имя объекта. Каждый идентификатор должен быть заключен в разделители индивидуально. Например:

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

или

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

Существует несколько специальных правил относительно разграничения многокомпонентных имен хранимых процедур в инструкции ODBC CALL. Дополнительные сведения см. в разделе Вызов хранимой процедуры.

Использование идентификаторов в качестве параметров в SQL Server

Многие системные хранимые процедуры, функции и инструкции DBCC принимают имена объектов как параметры. Некоторые из этих параметров принимают имена объектов, состоящие из нескольких частей, в то время как другие принимают только однокомпонентные имена. Независимо от того, ожидается однокомпонентное или многокомпонентное имя, способ синтаксического анализа и использования параметра определяется внутри SQL Server.

Однокомпонентные имена параметров

Если параметр — идентификатор, состоящий из одной части, имя может быть указано следующими способами:

  • Без кавычек или разделителей

  • Заключено в одинарные кавычки

  • Заключено в двойные кавычки

  • Заключено в квадратные скобки

Для имен, состоящих из одной части, строка в одиночных кавычках представляет имя объекта. Если разделители используются в одиночных кавычках, символы-разделители будут обработаны как часть имени.

Если имя содержит точку или другой символ, который не является частью набора символов, определенного для обычных идентификаторов, необходимо заключить имя объекта в одиночные кавычки, двойные кавычки или квадратные скобки.

Многокомпонентные имена параметров

Многокомпонентные имена — уточненные имена, которые включают имя базы данных или имя схемы, а также имя объекта. Когда многокомпонентное имя используется как параметр, SQL Server требует, чтобы вся строка, составляющая многокомпонентное имя, была заключена в набор одиночных кавычек.

EXEC MyProcedure @name = 'dbo.Employees'

Если отдельные части имени требуют разделителей, каждая часть имени должна быть разделена отдельно, как требуется. Например, если часть имени содержит точку, двойную кавычку или левую либо правую квадратную скобку, используйте квадратные скобки или двойные кавычки, чтобы разделить части. Заключите полное имя в одиночные кавычки.

Например, имя таблицы tab.one содержит точку. Чтобы не допустить интерпретации имени, как трехкомпонентного — dbo.tab.one, разграничьте части имени таблицы.

EXEC sp_help 'dbo.[tab.one]'

Следующий пример показывает то же имя таблицы, разграниченное двойными кавычками:

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