SET QUOTED_IDENTIFIER (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric の SQL 分析エンドポイントMicrosoft Fabric のウェアハウス

SQL Server に対して、識別子とリテラル文字列を区切る引用符に関して、ISO 規格に従うことを指定します。 Transact-SQL の予約済みキーワードを指定する場合や、Transact-SQL の構文規則で通常は識別子として許可されない文字がある場合は、二重引用符で識別子を区切ることができます。

Transact-SQL 構文表記規則

構文

-- Syntax for SQL Server, Azure SQL Database, serverless SQL pool in Azure Synapse Analytics, and Microsoft Fabric

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

SET QUOTED_IDENTIFIER ON

Note

SQL Server 2014 (12.x) 以前のバージョンの Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。

解説

SET QUOTED_IDENTIFIER が ON のとき (既定)、識別子を二重引用符 (" ") で囲むことができ、リテラルは単一引用符 (' ') で囲む必要があります。 二重引用符で囲まれた文字列はすべて、オブジェクト識別子として解釈されます。 したがって、引用符で区切られた識別子は、識別子に関する Transact-SQL の規則に従う必要はありません。 このような識別子では予約済みキーワードを使用でき、通常は Transact-SQL の識別子として許可されない文字を含めることもできます。 リテラル文字列式を二重引用符で区切ることはできません。リテラル文字列を区切るには、単一引用符を使用する必要があります。 単一引用符 (') がリテラル文字列の一部に含まれている場合は、2 つの連続する単一引用符 ('') を使用してください。 データベース内のオブジェクト名に対して予約済みキーワードを使用する場合は、SET QUOTED_IDENTIFIER を ON にする必要があります。

SET QUOTED_IDENTIFIER が OFF の場合、識別子を引用符で区切ることはできません。識別子に関しては Transact-SQL のすべての規則に従う必要があります。 詳細については、「データベース識別子」を参照してください。 リテラルは単一引用符と二重引用符のどちらで区切ることもできます。 リテラル文字列を二重引用符で区切る場合は、文字列の内部でアポストロフィなどの埋め込み単一引用符を使用できます。

注意

角括弧 ([ ]) で囲まれている識別子に QUOTED_IDENTIFIER が作用することはありません。

計算列やインデックス付きビューのインデックスを作成または変更するときには、SET QUOTED_IDENTIFIER を ON に設定する必要があります。 SET QUOTED_IDENTIFIER が OFF の場合、計算列にインデックスが設定されているテーブルやインデックス付きビューが設定されているテーブルに CREATE、UPDATE、INSERT、DELETE ステートメントを実行すると失敗します。 インデックス付きビューおよび計算列上のインデックスに必要な SET オプション設定の詳細については、「SET ステートメントの使用に関する留意事項」を参照してください。

フィルター選択されたインデックスを作成する場合は、SET QUOTED_IDENTIFIER を ON に設定する必要があります。

XML データ型のメソッドを呼び出す場合は、SET QUOTED_IDENTIFIER を ON に設定する必要があります。

SQL Server Native Client ODBC ドライバーおよび SQL Server Native Client OLE DB Provider for SQL Server では、接続時に自動的に QUOTED_IDENTIFIER が ON に設定されます。 これは、ODBC データ ソース、ODBC 接続属性、または OLE DB 接続プロパティを使って構成できます。 DB-Library アプリケーションからの接続に対しては、SET QUOTED_IDENTIFIER は既定で OFF に設定されています。

テーブルの作成時に QUOTED IDENTIFIER オプションが OFF に設定されていても、作成されるテーブルのメタデータでは、このオプションは常に ON として格納されます。

ストアド プロシージャを作成すると、SET QUOTED_IDENTIFIER と SET ANSI_NULLS の設定が取得され、以降そのストアド プロシージャを呼び出すときに使用されます。

SET QUOTED_IDENTIFIER をストアド プロシージャの内部で実行する場合、この設定は変更されません。

SET ANSI_DEFAULTS が ON の場合、QUOTED_IDENTIFIER も ON になります。

SET QUOTED_IDENTIFIER は、ALTER DATABASE の QUOTED_IDENTIFIER 設定にも対応します。

SET QUOTED_IDENTIFIER は Transact-SQL 解析時に有効であり、解析に対してのみ影響を与え、クエリの最適化やクエリの実行には影響しません。

最上位のアドホック バッチの場合、解析は QUOTED_IDENTIFIER に対するセッションの現在の設定を使って開始します。 バッチが解析される過程で、SET QUOTED_IDENTIFIER が出現すると、それ以降の解析動作が変更され、セッションのその設定が保存されます。 したがって、バッチが解析されて実行された後、セッションの QUOTED_IDENTIFER の設定は、バッチでの 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 ロールのメンバーシップが必要です。

A. 引用符で囲まれた識別子の設定と、予約済みキーワードを用いたオブジェクト名を使用する

次の例では、予約済みキーワード名を含むオブジェクト名を作成して使用するときに、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_IDENTIFIERON に設定した場合と OFF に設定した場合のそれぞれに対して、文字列式で単一引用符と二重引用符を使用する方法を示しています。

SET QUOTED_IDENTIFIER OFF;
GO

USE AdventureWorks2022;
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
CREATE PROCEDURE
CREATE RULE
CREATE TABLE
CREATE TRIGGER
CREATE VIEW
Data Types (データ型)
EXECUTE
SELECT
SET Statements
SET ANSI_DEFAULTS
sp_rename
データベース識別子