SET QUOTED_IDENTIFIER (Transact-SQL)

Applies to: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric の SQL 分析エンドポイント Microsoft Fabric のウェアハウス

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

Transact-SQL 構文表記規則

構文

SQL Server、Azure SQL Database、Azure Synapse Analytics のサーバーレス SQL プール、および Microsoft Fabric の構文。

SET QUOTED_IDENTIFIER { ON | OFF }

Azure Synapse Analytics と Parallel Data Warehouse の構文。

SET QUOTED_IDENTIFIER ON

Note

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

解説

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

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

Note

QUOTED_IDENTIFIER は、角かっこ ([ および ]) で囲まれた区切り記号付き識別子には影響しません。

計算列やインデックス付きビューでインデックスを作成または変更するとき、SET QUOTED_IDENTIFIERON に設定する必要があります。 SET QUOTED_IDENTIFIEROFFされている場合、計算列にインデックスがあるテーブル、またはインデックス付きビューを持つテーブルで、CREATEUPDATEINSERT、およびDELETEステートメントが失敗します。 計算列のインデックス付きビューとインデックスを使用して必要な SET オプションの設定の詳細については、「set ステートメントを使用する場合の Considerations」を参照してください

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

SET QUOTED_IDENTIFIERは、xml データ型メソッドを呼び出すときにONする必要があります。

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

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

ストアド プロシージャが作成されると、 SET QUOTED_IDENTIFIERSET ANSI_NULLS の設定がキャプチャされ、そのストアド プロシージャの後続の呼び出しに使用されます。

ストアド プロシージャ内で実行しても、 SET QUOTED_IDENTIFIER の設定は変更されません。

SET ANSI_DEFAULTSONされると、QUOTED_IDENTIFIERON

SET QUOTED_IDENTIFIERは、ALTER DATABASEQUOTED_IDENTIFIER設定に対応します。

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 のメンバーシップが必要です。

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