SET QUOTED_IDENTIFIER (Transact-SQL)

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

トピック リンク アイコンTransact-SQL 構文表記規則

構文

SET QUOTED_IDENTIFIER { ON | OFF }

説明

SET QUOTED_IDENTIFIER が ON の場合は、識別子を二重引用符で区切ることができます。リテラルは単一引用符で区切る必要があります。SET QUOTED_IDENTIFIER が OFF の場合、識別子を引用符で区切ることはできません。識別子に関しては Transact-SQL のすべての規則に従う必要があります。詳細については、「識別子」を参照してください。リテラルは単一引用符と二重引用符のどちらで区切ることもできます。

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

SET QUOTED_IDENTIFIER が OFF (既定値) の場合、式の内部のリテラル文字列は、単一引用符と二重引用符のどちらで区切ることもできます。リテラル文字列を二重引用符で区切る場合は、文字列の内部でアポストロフィなどの埋め込み単一引用符を使用できます。

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

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 の場合、SET QUOTED_IDENTIFIER は有効になります。

SET QUOTED_IDENTIFIER は、ALTER DATABASE の QUOTED_IDENTIFER 設定にも対応します。データベース設定の詳細については、「ALTER DATABASE (Transact-SQL)」および「データベース オプションの設定」を参照してください。

SET QUOTED_IDENTIFIER は解析時に設定されます。解析時に設定されるということは、SET ステートメントがバッチまたはストアド プロシージャ内に指定されている場合は、コードが実際にその場所まで実行されるかどうかに関係なく、設定が有効になることを意味します。つまり他のどのステートメントが実行されるよりも前に、SET ステートメントは有効になります。

権限

public ロールのメンバシップが必要です。

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

次の例では、予約済みキーワード名を含むオブジェクト名を作成して使用するときに、SET QUOTED_IDENTIFIER の設定を ON にして、テーブル名のキーワードを二重引用符で区切る必要があることを示しています。

SET QUOTED_IDENTIFIER OFF
GO
-- An attempt to create a table with a reserved keyword as a name
-- should fail.
CREATE TABLE "select" ("identity" INT IDENTITY NOT NULL, "order" INT NOT NULL)
GO

SET QUOTED_IDENTIFIER ON
GO

-- Will succeed.
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 AdventureWorks
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'Test')
   DROP TABLE dbo.Test
GO
USE AdventureWorks
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