SET QUOTED_IDENTIFIER (Transact-SQL)
Заставляет SQL Server следовать правилам ISO относительно разделения кавычками идентификаторов и строк-литералов. Идентификаторы, заключенные в двойные кавычки, могут быть либо зарезервированными ключевыми словами Transact-SQL, либо могут содержать символы, которые обычно запрещены правилами синтаксиса для идентификаторов Transact-SQL.
Синтаксис
SET QUOTED_IDENTIFIER { ON | OFF }
Замечания
Если параметру SET QUOTED_IDENTIFIER присвоено значение ON, то идентификаторы можно заключать в двойные кавычки и литералы должны быть разделены одинарными кавычками. Если параметру SET QUOTED_IDENTIFIER присвоено значение OFF, то идентификаторы нельзя заключать в кавычки и должны учитываться все правила Transact-SQL для идентификаторов. Дополнительные сведения см. в разделе Идентификаторы. Литералы могут разделяться как одинарными, так и двойными кавычками.
Если параметру SET QUOTED_IDENTIFIER присвоено значение ON (по умолчанию), то все строки, разделенные двойными кавычками, рассматриваются как идентификаторы объектов. Такие образом, заключенные в кавычки идентификаторы не должны удовлетворять правилам языка Transact-SQL для идентификаторов. Они могут быть зарезервированными ключевыми словами, а также могут содержать символы, обычно запрещенные для идентификаторов языка Transact-SQL. Выражения со строками-литералами нельзя заключать в двойные кавычки; для этих целей необходимо использовать одинарные кавычки. Если одинарная кавычка (') является частью строки-литерала, то ее необходимо записать через две одинарных кавычки ("). Если в именах объектов базы данных используются зарезервированные ключевые слова, то параметру SET QUOTED_IDENTIFIER должно быть присвоено значение ON.
Если параметру SET QUOTED_IDENTIFIER присвоено значение OFF, строки-литералы в выражениях можно разделять либо одинарными, либо двойными кавычками. Если строки-литералы разделяются двойными кавычками, то в строке могут содержаться внедренные одинарные кавычки, такие как апострофы.
При создании или изменении индексов в вычисляемых столбцах или индексированных представлениях параметру SET QUOTED_IDENTIFIER должно быть присвоено значение OFF. Если параметр SET QUOTED_IDENTIFIER имеет значение OFF, то в таблицах с индексами инструкции CREATE, UPDATE, INSERT и DELETE в вычисляемых столбцах или индексированных представлениях не будут работать. Дополнительные сведения о настройке параметров SET с индексированными представлениями и индексами на вычисляемых столбцах см. в подразделе «Анализ использования инструкций SET» раздела SET (Transact-SQL).
При соединении с драйвером ODBC для собственного клиента SQL Server и поставщика OLE DB для собственного клиента SQL Server для SQL Server параметр QUOTED_IDENTIFIER автоматически устанавливается в значение ON. Это может быть настроено в источниках данных ODBC, в атрибутах соединения ODBC или свойствах соединения OLE DB. По умолчанию параметр SET QUOTED_IDENTIFIER имеет значение OFF для соединений из приложений DB-Library.
После создания таблицы параметр QUOTED IDENTIFIER всегда записывается в метаданные таблицы со значением ON, даже если он был установлен в OFF при создании таблицы.
Когда создается хранимая процедура, параметры SET QUOTED_IDENTIFIER и SET ANSI_NULLS фиксируются и используются для последующих вызовов этой хранимой процедуры.
При выполнении операций внутри хранимой процедуры значение SET QUOTED_IDENTIFIER не меняется.
Если параметр SET ANSI_DEFAULTS имеет значение ON, параметр SET QUOTED_IDENTIFIER включается.
Также параметр SET QUOTED_IDENTIFIER связан с настройками QUOTED_IDENTIFER инструкции ALTER DATABASE. Дополнительные сведения о настройке свойств базы данных см. в разделах ALTER DATABASE (Transact-SQL) и Установка параметров базы данных.
Параметр SET QUOTED_IDENTIFIER устанавливается во время синтаксического анализа. Установка во время синтаксического анализа означает, что если инструкция SET присутствует в пакете или хранимой процедуре, то она вступает в силу независимо от того, достигает ли фактическое выполнение кода соответствующей точки. Кроме того, инструкция SET вступает в силу до выполнения любых инструкций.
Настройка QUOTED_IDENTIFIER не влияет на разделение идентификаторов с помощью квадратных скобок [ и ].
Разрешения
Необходимо членство в роли public.
Примеры
А. Использование режима заключенных в кавычки идентификаторов и имен объектов, состоящих из зарезервированных слов
В следующем примере показано, что параметр SET QUOTED_IDENTIFIER должен иметь значение ON, а ключевые слова в именах таблиц должны быть заключены в двойные кавычки, чтобы создать и использовать объекты, содержащие в именах зарезервированные ключевые слова.
SET QUOTED_IDENTIFIER OFF
GO
-- An attempt to create a table with a reserved keyword as a name
-- should fail.
CREATE TABLE "select" ("identity" INT IDENTITY NOT NULL, "order" INT NOT NULL);
GO
SET QUOTED_IDENTIFIER ON;
GO
-- Will succeed.
CREATE TABLE "select" ("identity" INT IDENTITY NOT NULL, "order" INT NOT NULL);
GO
SELECT "identity","order"
FROM "select"
ORDER BY "order";
GO
DROP TABLE "SELECT";
GO
SET QUOTED_IDENTIFIER OFF;
GO
Б. Использование настроек заключенного в кавычки идентификатора с двойными и одинарными кавычками
В этом примере показано, как используются двойные и одинарные кавычки в строковых выражениях, если параметру SET QUOTED_IDENTIFIER присвоено значение ON и значение OFF.
SET QUOTED_IDENTIFIER OFF;
GO
USE AdventureWorks2008R2;
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'Test')
DROP TABLE dbo.Test;
GO
USE AdventureWorks2008R2;
CREATE TABLE dbo.Test (ID INT, String VARCHAR(30)) ;
GO
-- Literal strings can be in single or double quotation marks.
INSERT INTO dbo.Test VALUES (1, "'Text in single quotes'");
INSERT INTO dbo.Test VALUES (2, '''Text in single quotes''');
INSERT INTO dbo.Test VALUES (3, 'Text with 2 '''' single quotes');
INSERT INTO dbo.Test VALUES (4, '"Text in double quotes"');
INSERT INTO dbo.Test VALUES (5, """Text in double quotes""");
INSERT INTO dbo.Test VALUES (6, "Text with 2 """" double quotes");
GO
SET QUOTED_IDENTIFIER ON;
GO
-- Strings inside double quotation marks are now treated
-- as object names, so they cannot be used for literals.
INSERT INTO dbo."Test" VALUES (7, 'Text with a single '' quote');
GO
-- Object identifiers do not have to be in double quotation marks
-- if they are not reserved keywords.
SELECT ID, String
FROM dbo.Test;
GO
DROP TABLE dbo.Test;
GO
SET QUOTED_IDENTIFIER OFF;
GO
Ниже приводится результирующий набор.
Идентификатор Строка
----------- ------------------------------
1 'Текст в одиночных кавычках'
2 'Текст в одиночных кавычках'
3 Текст с 2 одинарными кавычками ''
4 "Текст в двойных кавычках"
5 "Текст в двойных кавычках"
6 Текст с двумя двойными кавычками ""
7 Текст с одинарной кавычкой '
См. также