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


SET QUOTED_IDENTIFIER (Transact-SQL)

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure конечной точке аналитики платформы Аналитики Azure Synapse Analytics (PDW) в Microsoft Fabric Хранилище в Microsoft Fabric

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

Соглашения о синтаксисе Transact-SQL

Синтаксис

Синтаксис для SQL Server, База данных SQL Azure, бессерверного пула SQL в Azure Synapse Analytics и Microsoft Fabric.

SET QUOTED_IDENTIFIER { ON | OFF }

Синтаксис для Azure Synapse Analytics и параллельного хранилища данных.

SET QUOTED_IDENTIFIER ON

Замечания

Если SET QUOTED_IDENTIFIER задано ON (по умолчанию), идентификаторы могут быть разделены двойными кавычками (""), а литералы должны быть разделены одними кавычками (''). Все строки, находящиеся в двойных кавычках, интерпретируются как идентификаторы объектов. Идентификаторы с разделителями не должны соответствовать правилам для идентификаторов Transact-SQL. Они могут быть ключевыми словами и включать символы, не разрешенные в идентификаторах Transact-SQL. Если двойная кавычка (") является частью идентификатора, она может быть представлена двумя двойными кавычками (""). SET QUOTED_IDENTIFIER должно быть ON , если зарезервированные ключевые слова используются для имен объектов в базе данных.

В SET QUOTED_IDENTIFIER этом случае OFFидентификаторы не могут быть кавычек и должны соответствовать всем правилам Transact-SQL для идентификаторов. Дополнительные сведения см. в разделе "Идентификаторы базы данных". Литералы могут разделяться как одинарными, так и двойными кавычками. Если строки-литералы разделяются двойными кавычками, то в строке могут содержаться внедренные одинарные кавычки, такие как апострофы.

Примечание.

QUOTED_IDENTIFIER не влияет на идентификаторы с разделителями, заключенные в квадратные скобки ([ и ]).

SET QUOTED_IDENTIFIERON при создании или изменении индексов в вычисляемых столбцах или индексированных представлениях. Если SET QUOTED_IDENTIFIER значение OFFравно, то UPDATECREATEINSERTDELETE операторы и инструкции завершаются сбоем в таблицах с индексами в вычисляемых столбцах или таблицах с индексируемыми представлениями. Дополнительные сведения о необходимых SET параметрах с индексируемыми представлениями и индексами в вычисляемых столбцах см. в разделе "Рекомендации" при использовании инструкций SET.

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

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

Драйвер ODBC собственного клиента SQL Server и поставщик OLE DB собственного клиента SQL Server для SQL Server автоматически устанавливаются QUOTED_IDENTIFIER ON при подключении. Это может быть настроено в источниках данных ODBC, в атрибутах соединения ODBC или свойствах соединения OLE DB. Значение по умолчанию SET QUOTED_IDENTIFIER предназначено OFF для подключений из приложений DB-Library.

При создании таблицы параметр всегда хранится как ON в метаданных таблицы, QUOTED IDENTIFIER даже если параметр задан OFF при создании таблицы.

При создании SET QUOTED_IDENTIFIER хранимой процедуры фиксируются и SET ANSI_NULLS используются параметры для последующих вызовов этой хранимой процедуры.

При выполнении внутри хранимой процедуры параметр SET QUOTED_IDENTIFIER не изменяется.

Когда SET ANSI_DEFAULTS есть ON, QUOTED_IDENTIFIER также ON.

SET QUOTED_IDENTIFIER соответствует параметру QUOTED_IDENTIFIER ALTER DATABASE.

SET QUOTED_IDENTIFIER применяется во время синтаксического анализа Transact-SQL и влияет только на анализ, а не на выполнение или оптимизацию запроса.

Для нерегламентированного пакета верхнего уровня синтаксический анализ начинается с использованием текущего параметра сеанса.QUOTED_IDENTIFIER Так как пакет анализирует любое вхождение SET QUOTED_IDENTIFIER изменений в поведении синтаксического анализа с этого момента и сохраните этот параметр для сеанса. Поэтому после синтаксического анализа и выполнения пакета параметр сеанса QUOTED_IDENTIFIER будет задан в соответствии с последним вхождением SET QUOTED_IDENTIFIER в пакете.

Статический transact-SQL в хранимой процедуре анализируется с помощью QUOTED_IDENTIFIER параметра, который действует для пакета, создавшего или изменившего хранимую процедуру. SET QUOTED_IDENTIFIER не работает, когда появляется в тексте хранимой процедуры в виде статического Transact-SQL.

Для вложенного пакета с помощью sp_executesql или exec()синтаксического анализа начинается использование QUOTED_IDENTIFIER параметра сеанса. Если вложенный пакет находится внутри хранимой процедуры, синтаксический анализ начинается с настройки QUOTED_IDENTIFIER хранимой процедуры. При синтаксическом анализе вложенного пакета любые изменения SET QUOTED_IDENTIFIER поведения синтаксического анализа с этого момента, но параметр сеанса QUOTED_IDENTIFIER не обновляется.

Чтобы просмотреть текущее значение для этого параметра, выполните следующий запрос:

DECLARE @QUOTED_IDENTIFIER VARCHAR(3) = 'OFF';

IF ((256 & @@OPTIONS) = 256)
BEGIN
    SET @QUOTED_IDENTIFIER = 'ON';
END

SELECT @QUOTED_IDENTIFIER AS QUOTED_IDENTIFIER;

Разрешения

Необходимо быть членом роли public.

Примеры

А. Использование параметра идентификатора с кавычками и зарезервированных имен объектов word

В следующем примере показано, что параметр SET QUOTED_IDENTIFIER должен иметь значение ON, а ключевые слова в именах таблиц должны быть заключены в двойные кавычки, чтобы создать и использовать объекты, содержащие в именах зарезервированные ключевые слова.

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. Использование параметра идентификатора кавычки с одними и двойными кавычками

В этом примере показано, как используются двойные и одинарные кавычки в строковых выражениях, если параметру SET QUOTED_IDENTIFIER присвоено значение ON и значение OFF.

SET QUOTED_IDENTIFIER OFF;
GO

USE AdventureWorks2022;
GO

IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_NAME = 'Test')
    DROP TABLE dbo.Test;
GO

USE AdventureWorks2022;
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