Поделиться через


SET QUOTED_IDENTIFIER (Transact-SQL)

Заставляет SQL Server следовать правилам ISO относительно разделения кавычками идентификаторов и строк-литералов. Идентификаторы, заключенные в двойные кавычки, могут быть либо зарезервированными ключевыми словами Transact-SQL, либо могут содержать символы, которые обычно запрещены правилами синтаксиса для идентификаторов 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).

SET QUOTED_IDENTIFIER должен иметь значение ON при создании отфильтрованного индекса.

SET QUOTED_IDENTIFIER должно быть присвоено значение ON при вызове методов типа данных XML.

При соединении с драйвером Native Client OLE DB SQL Server и поставщиком Native Client 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 вступает в силу до выполнения каких-либо других инструкций. Если в пакете присутствуют несколько конфликтующих инструкций 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 AdventureWorks2012;
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'Test')
   DROP TABLE dbo.Test;
GO
USE AdventureWorks2012;
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

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

ID String

----------- ------------------------------

1 'Text in single quotes'

2 'Text in single quotes'

3 Text with 2 '' single quotes

4 "Text in double quotes"

5 "Text in double quotes"

6 Text with 2 "" double quotes

7 Text with a single ' quote

См. также

Справочник

CREATE DATABASE (Transact-SQL)

CREATE DEFAULT (Transact-SQL)

CREATE PROCEDURE (Transact-SQL)

CREATE RULE (Transact-SQL)

Инструкция CREATE TABLE (Transact-SQL)

CREATE TRIGGER (Transact-SQL)

CREATE VIEW (Transact-SQL)

Типы данных (Transact-SQL)

EXECUTE (Transact-SQL)

SELECT (Transact-SQL)

Инструкции SET (Transact-SQL)

SET ANSI_DEFAULTS (Transact-SQL)

sp_rename (Transact-SQL)