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 の構文規則で通常は識別子として許可されない文字がある場合は、二重引用符で識別子を区切ることができます。
構文
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_IDENTIFIER
がON
(既定) の場合、識別子は二重引用符 (""
) で区切ることができ、リテラルは単一引用符 (''
) で区切る必要があります。 二重引用符で囲まれた文字列はすべて、オブジェクト識別子として解釈されます。 引用符で囲まれた識別子は、Transact-SQL の識別子の規則に従う必要はありません。 これはキーワードにすることができます。また、Transact-SQL 識別子では許可されない文字を含めることができます。 二重引用符 ("
) が識別子の一部である場合は、2 つの二重引用符 (""
) で表すことができます。 SET QUOTED_IDENTIFIER
は、データベース内のオブジェクト名に予約済みキーワードを使用する場合に ON
する必要があります。
SET QUOTED_IDENTIFIER
がOFF
されている場合、識別子は引用符で囲むのはできないため、識別子のすべての Transact-SQL ルールに従う必要があります。 詳細については、「 Database 識別子」を参照してください。 リテラルは単一引用符と二重引用符のどちらで区切ることもできます。 リテラル文字列を二重引用符で区切る場合は、文字列の内部でアポストロフィなどの埋め込み単一引用符を使用できます。
Note
QUOTED_IDENTIFIER
は、角かっこ ([
および ]
) で囲まれた区切り記号付き識別子には影響しません。
計算列やインデックス付きビューでインデックスを作成または変更するとき、SET QUOTED_IDENTIFIER
を ON
に設定する必要があります。 SET QUOTED_IDENTIFIER
がOFF
されている場合、計算列にインデックスがあるテーブル、またはインデックス付きビューを持つテーブルで、CREATE
、UPDATE
、INSERT
、および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_IDENTIFIER
と SET ANSI_NULLS
の設定がキャプチャされ、そのストアド プロシージャの後続の呼び出しに使用されます。
ストアド プロシージャ内で実行しても、 SET QUOTED_IDENTIFIER
の設定は変更されません。
SET ANSI_DEFAULTS
がON
されると、QUOTED_IDENTIFIER
もON
。
SET QUOTED_IDENTIFIER
は、QUOTED_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_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
- データベース識別子