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


SET QUOTED_IDENTIFIER (Transact-SQL)

Применимо к:SQL ServerБаза данных SQL AzureУправляемый экземпляр SQL AzureAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL analytics в Microsoft FabricWarehouse в Microsoft FabricSQL базы данных в Microsoft Fabric

Параметр QUOTED_IDENTIFIER приводит к тому, что 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 и параллельных Data Warehouse.

SET QUOTED_IDENTIFIER ON

Замечания

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

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

Примечание.

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

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

При создании отфильтрованного индекса необходимо задать значение SET QUOTED_IDENTIFIERON .

Необходимо задать значение SET QUOTED_IDENTIFIERON при вызове методов типа данных XML .

Драйвер 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_DEFAULTSONзначение , QUOTED_IDENTIFIER также задано значение ON.

SET QUOTED_IDENTIFIER соответствует параметру QUOTED_IDENTIFIERALTER 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 AS VARCHAR (3) = 'OFF';

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

SELECT @QUOTED_IDENTIFIER AS QUOTED_IDENTIFIER;

Разрешения

Требуется членство в роли общедоступной фиксированной базы данных.

Примеры

А. Использование параметра идентификатора с кавычками и зарезервированных имен объектов 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 AdventureWorks2025;
GO

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

USE AdventureWorks2025;
GO

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