SET QUOTED_IDENTIFIER (Transact-SQL)SET QUOTED_IDENTIFIER (Transact-SQL)

Применимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions) ДаБаза данных SQL AzureAzure SQL DatabaseYesБаза данных SQL AzureAzure SQL Database ДаУправляемый экземпляр SQL AzureAzure SQL Managed InstanceYesУправляемый экземпляр SQL AzureAzure SQL Managed Instance даAzure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics даПараллельное хранилище данныхParallel Data WarehouseyesПараллельное хранилище данныхParallel Data WarehouseПрименимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions) ДаБаза данных SQL AzureAzure SQL DatabaseYesБаза данных SQL AzureAzure SQL Database ДаУправляемый экземпляр SQL AzureAzure SQL Managed InstanceYesУправляемый экземпляр SQL AzureAzure SQL Managed Instance даAzure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics даПараллельное хранилище данныхParallel Data WarehouseyesПараллельное хранилище данныхParallel Data Warehouse

Заставляет SQL ServerSQL Server следовать правилам ISO относительно разделения кавычками идентификаторов и строк-литералов.Causes SQL ServerSQL Server to follow the ISO rules regarding quotation mark delimiting identifiers and literal strings. Идентификаторы, заключенные в двойные кавычки, могут быть либо зарезервированными ключевыми словами Transact-SQLTransact-SQL, либо могут содержать символы, которые обычно запрещены правилами синтаксиса для идентификаторов Transact-SQLTransact-SQL.Identifiers delimited by double quotation marks can be either Transact-SQLTransact-SQL reserved keywords or can contain characters not generally allowed by the Transact-SQLTransact-SQL syntax rules for identifiers.

Значок ссылки на раздел Синтаксические обозначения в Transact-SQLTopic link icon Transact-SQL Syntax Conventions

СинтаксисSyntax

-- Syntax for SQL Server, Azure SQL Database and SQL on-demand (preview) in Azure Synapse Analytics

SET QUOTED_IDENTIFIER { ON | OFF }
-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse

SET QUOTED_IDENTIFIER ON

Примечание

Ссылки на описание синтаксиса Transact-SQL для SQL Server 2014 и более ранних версий, см. в статье Документация по предыдущим версиям.To view Transact-SQL syntax for SQL Server 2014 and earlier, see Previous versions documentation.

RemarksRemarks

Когда SET QUOTED_IDENTIFIER включен (ON) (по умолчанию), идентификаторы можно отделять двойными кавычками (" "), а литералы должны быть отделены одинарными кавычками (' ').When SET QUOTED_IDENTIFIER is ON (default), identifiers can be delimited by double quotation marks (" "), and literals must be delimited by single quotation marks (' '). Все строки, находящиеся в двойных кавычках, интерпретируются как идентификаторы объектов.All strings delimited by double quotation marks are interpreted as object identifiers. Такие образом, заключенные в кавычки идентификаторы не должны удовлетворять правилам языка Transact-SQLTransact-SQL для идентификаторов.Therefore, quoted identifiers do not have to follow the Transact-SQLTransact-SQL rules for identifiers. Они могут быть зарезервированными ключевыми словами, а также могут содержать символы, обычно запрещенные для идентификаторов языка Transact-SQLTransact-SQL.They can be reserved keywords and can include characters not generally allowed in Transact-SQLTransact-SQL identifiers. Выражения со строками-литералами нельзя заключать в двойные кавычки; для этих целей необходимо использовать одинарные кавычки.Double quotation marks cannot be used to delimit literal string expressions; single quotation marks must be used to enclose literal strings. Если одинарная кавычка (') является частью строки литерала, то она может быть представлена двумя одинарными кавычками ('').If a single quotation mark (') is part of the literal string, it can be represented by two single quotation marks (''). Если в именах объектов базы данных используются зарезервированные ключевые слова, то параметру SET QUOTED_IDENTIFIER должно быть присвоено значение ON.SET QUOTED_IDENTIFIER must be ON when reserved keywords are used for object names in the database.

Если параметру SET QUOTED_IDENTIFIER присвоено значение OFF, то идентификаторы невозможно заключать в кавычки и следует соблюдать все правила Transact-SQLTransact-SQL для идентификаторов.When SET QUOTED_IDENTIFIER is OFF, identifiers cannot be quoted and must follow all Transact-SQLTransact-SQL rules for identifiers. Дополнительные сведения см. в разделе Идентификаторы баз данных.For more information, see Database Identifiers. Литералы могут разделяться как одинарными, так и двойными кавычками.Literals can be delimited by either single or double quotation marks. Если строки-литералы разделяются двойными кавычками, то в строке могут содержаться внедренные одинарные кавычки, такие как апострофы.If a literal string is delimited by double quotation marks, the string can contain embedded single quotation marks, such as apostrophes.

Примечание

QUOTED_IDENTIFIER не влияет на идентификаторы с разделителем, заключенные в квадратные скобки ([ ]).QUOTED_IDENTIFIER does not affect delimited identifiers enclosed in brackets ([ ]).

Параметр SET QUOTED_IDENTIFIER должен иметь значение ON при создании или изменении индексов по вычисляемым столбцам или индексированным представлениям.SET QUOTED_IDENTIFIER must be ON when you are creating or changing indexes on computed columns or indexed views. Если для параметра SET QUOTED_IDENTIFIER установлено значение OFF, то выполнение инструкций CREATE, UPDATE, INSERT и DELETE для таблиц с индексами, основанными на вычисляемых столбцах или индексированных представлениях, будет завершаться ошибкой.If SET QUOTED_IDENTIFIER is OFF, then CREATE, UPDATE, INSERT, and DELETE statements will fail on tables with indexes on computed columns, or tables with indexed views. Дополнительные сведения о настройке параметров SET с индексированными представлениями и индексами в вычисляемых столбцах см. в разделе Анализ использования инструкций SET.For more information about required SET option settings with indexed views and indexes on computed columns, see Considerations when you use the SET statements.

Параметр SET QUOTED_IDENTIFIER должен иметь значение ON при создании отфильтрованного индекса.SET QUOTED_IDENTIFIER must be ON when you are creating a filtered index.

Параметр SET QUOTED_IDENTIFIER должен иметь значение ON при вызове методов типа данных XML.SET QUOTED_IDENTIFIER must be ON when you invoke XML data type methods.

При соединении с драйвером Native Client OLE DB SQL ServerSQL Server и поставщиком Native Client OLE DB SQL ServerSQL Server для SQL ServerSQL Server параметр QUOTED_IDENTIFIER автоматически устанавливается в значение ON.The SQL ServerSQL Server Native Client ODBC driver and SQL ServerSQL Server Native Client OLE DB Provider for SQL ServerSQL Server automatically set QUOTED_IDENTIFIER to ON when connecting. Это может быть настроено в источниках данных ODBC, в атрибутах соединения ODBC или свойствах соединения OLE DB.This can be configured in ODBC data sources, in ODBC connection attributes, or OLE DB connection properties. По умолчанию параметр SET QUOTED_IDENTIFIER имеет значение OFF для соединений из приложений DB-Library.The default for SET QUOTED_IDENTIFIER is OFF for connections from DB-Library applications.

После создания таблицы параметр QUOTED IDENTIFIER всегда записывается в метаданные таблицы со значением ON, даже если он был установлен в OFF при создании таблицы.When a table is created, the QUOTED IDENTIFIER option is always stored as ON in the table's metadata even if the option is set to OFF when the table is created.

Когда создается хранимая процедура, параметры SET QUOTED_IDENTIFIER и SET ANSI_NULLS фиксируются и используются для последующих вызовов этой хранимой процедуры.When a stored procedure is created, the SET QUOTED_IDENTIFIER and SET ANSI_NULLS settings are captured and used for subsequent invocations of that stored procedure.

При выполнении операций внутри хранимой процедуры значение SET QUOTED_IDENTIFIER не меняется.When executed inside a stored procedure, the setting of SET QUOTED_IDENTIFIER is not changed.

Если для SET ANSI_DEFAULTS задано значение ON, для QUOTED_IDENTIFIER также задано значение ON.When SET ANSI_DEFAULTS is ON, QUOTED_IDENTIFIER is also ON.

Также параметр SET QUOTED_IDENTIFIER связан с параметром QUOTED_IDENTIFIER инструкции ALTER DATABASE.SET QUOTED_IDENTIFIER also corresponds to the QUOTED_IDENTIFIER setting of ALTER DATABASE.

SET QUOTED_IDENTIFIER применяется во время синтаксического анализа Transact-SQLTransact-SQL и влияет только на анализ, а не на выполнение или оптимизацию запроса.SET QUOTED_IDENTIFIER takes effect at Transact-SQLTransact-SQL parse-time and only affects parsing, not query optimization or query execution.

При анализе неструктурированных пакетов верхнего уровня используется текущий параметр сеанса для QUOTED_IDENTIFIER.For a top-level ad-hoc batch parsing begins using the session's current setting for QUOTED_IDENTIFIER. При анализе пакета все вхождения SET QUOTED_IDENTIFIER приведут к изменению поведения анализа с этой точки и сохранят этот параметр для сеанса.As the batch is parsed any occurrence of SET QUOTED_IDENTIFIER will change the parsing behavior from that point on, and save that setting for the session. Поэтому после анализа и выполнения пакета параметр QUOTED_IDENTIFER сеанса будет задан в соответствии с последним вхождением SET QUOTED_IDENTIFIER в пакете.So after the batch is parsed and executed, the session's QUOTED_IDENTIFER setting will be set according to the last occurrence of SET QUOTED_IDENTIFIER in the batch.

Статический Transact-SQLTransact-SQL в хранимой процедуре анализируется с использованием параметра QUOTED_IDENTIFIER, действующего для пакета, создавшего или изменившего хранимую процедуру.Static Transact-SQLTransact-SQL in a stored procedure is parsed using the QUOTED_IDENTIFIER setting in effect for the batch that created or altered the stored procedure. Параметр SET QUOTED_IDENTIFIER не работает, когда появляется в тексте хранимой процедуры в виде статического Transact-SQLTransact-SQL.SET QUOTED_IDENTIFIER has no effect when it appears in the body of a stored procedure as static Transact-SQLTransact-SQL.

Анализ вложенного пакета с процедурой sp_executesql или exec() начинается с использованием параметра QUOTED_IDENTIFIER сеанса.For a nested batch using sp_executesql or exec(), the parsing begins using the QUOTED_IDENTIFIER setting of the session. Если вложенный пакет находится внутри хранимой процедуры, анализ начинается с использованием параметра QUOTED_IDENTIFIER хранимой процедуры.If the nested batch is inside a stored procedure, parsing starts using the QUOTED_IDENTIFIER setting of the stored procedure. При анализе пакета все вхождения SET QUOTED_IDENTIFIER приведут к изменению поведения анализа с этой точки, но параметр QUOTED_IDENTIFIER сеанса останется без изменений.As the nested batch is parsed, any occurrence of SET QUOTED_IDENTIFIER will change the parsing behavior from that point on, but the session's QUOTED_IDENTIFIER setting will not be updated.

Чтобы просмотреть текущее значение для этого параметра, выполните следующий запрос:To view the current setting for this setting, run the following query:

DECLARE @QUOTED_IDENTIFIER VARCHAR(3) = 'OFF';
IF ( (256 & @@OPTIONS) = 256 ) 
SET @QUOTED_IDENTIFIER = 'ON';

SELECT @QUOTED_IDENTIFIER AS QUOTED_IDENTIFIER;

РазрешенияPermissions

Необходимо членство в роли PUBLIC.Requires membership in the PUBLIC role.

ПримерыExamples

A.A. Использование режима заключенных в кавычки идентификаторов и имен объектов, состоящих из зарезервированных словUsing the quoted identifier setting and reserved word object names

В следующем примере показано, что параметр SET QUOTED_IDENTIFIER должен иметь значение ON, а ключевые слова в именах таблиц должны быть заключены в двойные кавычки, чтобы создать и использовать объекты, содержащие в именах зарезервированные ключевые слова.The following example shows that the SET QUOTED_IDENTIFIER setting must be ON, and the keywords in table names must be in double quotation marks to create and use objects that have reserved keyword names.

SET QUOTED_IDENTIFIER OFF
GO

-- Create statement fails.
CREATE TABLE "select" ("identity" INT IDENTITY NOT NULL, "order" INT NOT NULL);
GO

SET QUOTED_IDENTIFIER ON;
GO

-- Create statement succeeds.
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

Б.B. Использование настроек заключенного в кавычки идентификатора с двойными и одинарными кавычкамиUsing the quoted identifier setting with single and double quotation marks

В этом примере показано, как используются двойные и одинарные кавычки в строковых выражениях, если параметру SET QUOTED_IDENTIFIER присвоено значение ON и значение OFF.The following example shows the way single and double quotation marks are used in string expressions with SET QUOTED_IDENTIFIER set to ON and 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

Результирующий набор:Here is the result set.

 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

См. также:See Also

CREATE DATABASE CREATE DATABASE
CREATE DEFAULT CREATE DEFAULT
CREATE PROCEDURE CREATE PROCEDURE
CREATE RULE CREATE RULE
CREATE TABLE CREATE TABLE
CREATE TRIGGER CREATE TRIGGER
CREATE VIEW CREATE VIEW
Data Types Data Types
EXECUTE EXECUTE
SELECT SELECT
Инструкции SET SET Statements
SET ANSI_DEFAULTS SET ANSI_DEFAULTS
sp_rename sp_rename
Идентификаторы баз данныхDatabase Identifiers