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_IDENTIFIER
ON
при создании или изменении индексов в вычисляемых столбцах или индексированных представлениях. Если SET QUOTED_IDENTIFIER
значение OFF
равно, то UPDATE
CREATE
INSERT
DELETE
операторы и инструкции завершаются сбоем в таблицах с индексами в вычисляемых столбцах или таблицах с индексируемыми представлениями. Дополнительные сведения о необходимых 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
Связанный контент
- CREATE DATABASE
- 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
- Идентификаторы базы данных