SET QUOTED_IDENTIFIER (Transact-SQL)SET QUOTED_IDENTIFIER (Transact-SQL)

適用対象: ○SQL Server ○Azure SQL Database ○Azure SQL Data Warehouse ○Parallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

SQL ServerSQL Server に対して、識別子とリテラル文字列を区切る引用符に関して、ISO 規格に従うことを指定します。Causes SQL ServerSQL Server to follow the ISO rules regarding quotation mark delimiting identifiers and literal strings. Transact-SQLTransact-SQL の予約済みキーワードを指定する場合や、Transact-SQLTransact-SQL の構文規則で通常は識別子として許可されない文字がある場合は、二重引用符で識別子を区切ることができます。Identifiers delimited by double quotation marks can be either Transact-SQLTransact-SQL reserved keywords or can contain characters not generally allowed by the Transact-SQLTransact-SQL syntax rules for identifiers.

トピック リンク アイコン Transact-SQL 構文表記規則Topic link icon Transact-SQL Syntax Conventions

構文Syntax

-- Syntax for SQL Server and Azure SQL Database

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

SET QUOTED_IDENTIFIER ON

RemarksRemarks

SET QUOTED_IDENTIFIER が ON の場合は、識別子を二重引用符で区切ることができます。リテラルは単一引用符で区切る必要があります。When SET QUOTED_IDENTIFIER is ON, identifiers can be delimited by double quotation marks, and literals must be delimited by single quotation marks. SET QUOTED_IDENTIFIER が OFF の場合、識別子を引用符で区切ることはできません。識別子に関しては Transact-SQLTransact-SQL のすべての規則に従う必要があります。When SET QUOTED_IDENTIFIER is OFF, identifiers cannot be quoted and must follow all Transact-SQLTransact-SQL rules for identifiers. 詳細については、「データベース識別子」を参照してください。For more information, see Database Identifiers. リテラルは単一引用符と二重引用符のどちらで区切ることもできます。Literals can be delimited by either single or double quotation marks.

SET QUOTED_IDENTIFIER が ON (既定値) の場合、二重引用符で区切られた文字列はすべてオブジェクト識別子として解釈されます。When SET QUOTED_IDENTIFIER is ON (default), all strings delimited by double quotation marks are interpreted as object identifiers. したがって、引用符で区切られた識別子は、識別子に関する Transact-SQLTransact-SQL の規則に従う必要はありません。Therefore, quoted identifiers do not have to follow the Transact-SQLTransact-SQL rules for identifiers. このような識別子では予約済みキーワードを使用でき、通常は Transact-SQLTransact-SQL の識別子として許可されない文字を含めることもできます。They can be reserved keywords and can include characters not generally allowed in Transact-SQLTransact-SQL identifiers. リテラル文字列式を二重引用符で区切ることはできません。リテラル文字列を区切るには、単一引用符を使用する必要があります。Double quotation marks cannot be used to delimit literal string expressions; single quotation marks must be used to enclose literal strings. 単一引用符 ( ' ) がリテラル文字列の一部に含まれている場合は、2 つの連続する単一引用符 ( '' ) を使用してください。If a single quotation mark (') is part of the literal string, it can be represented by two single quotation marks ("). データベース内のオブジェクト名に対して予約済みキーワードを使用する場合は、SET QUOTED_IDENTIFIER を ON にする必要があります。SET QUOTED_IDENTIFIER must be ON when reserved keywords are used for object names in the database.

SET QUOTED_IDENTIFIER が OFF (既定値) の場合、式の内部のリテラル文字列は、単一引用符と二重引用符のどちらで区切ることもできます。When SET QUOTED_IDENTIFIER is OFF, literal strings in expressions can be delimited by single or double quotation marks. リテラル文字列を二重引用符で区切る場合は、文字列の内部でアポストロフィなどの埋め込み単一引用符を使用できます。If a literal string is delimited by double quotation marks, the string can contain embedded single quotation marks, such as apostrophes.

計算列やインデックス付きビューのインデックスを作成または操作するときには、SET QUOTED_IDENTIFIER を ON に設定する必要があります。SET QUOTED_IDENTIFIER must be ON when you are creating or changing indexes on computed columns or indexed views. SET QUOTED_IDENTIFIER が OFF の場合、計算列上にインデックスが設定されているテーブルやインデックス付きビューに対して CREATE、UPDATE、INSERT、および DELETE ステートメントを実行しようとすると失敗します。If SET QUOTED_IDENTIFIER is OFF, CREATE, UPDATE, INSERT, and DELETE statements on tables with indexes on computed columns or indexed views will fail. インデックス付きビューおよび計算列上のインデックスに必要な SET オプション設定の詳細については、SET ステートメント関するページの「SET ステートメントの使用に関する留意事項」を参照してください。For more information about required SET option settings with indexed views and indexes on computed columns, see "Considerations When You Use the SET Statements" in SET Statements.

フィルター選択されたインデックスを作成する場合は、SET QUOTED_IDENTIFIER を ON に設定する必要があります。SET QUOTED_IDENTIFIER must be ON when you are creating a filtered index.

XML データ型のメソッドを呼び出す場合は、SET QUOTED_IDENTIFIER を ON に設定する必要があります。SET QUOTED_IDENTIFIER must be ON when you invoke XML data type methods.

SQL ServerSQL Server Native Client ODBC ドライバーおよび SQL ServerSQL Server Native Client OLE DB Provider for SQL ServerSQL Server では、接続時に自動的に QUOTED_IDENTIFIER が ON に設定されます。The SQL ServerSQL Server Native Client ODBC driver and SQL ServerSQL Server Native Client OLE DB Provider for SQL ServerSQL Server automatically set QUOTED_IDENTIFIER to ON when connecting. これは、ODBC データ ソース、ODBC 接続属性、または OLE DB 接続プロパティを使って構成できます。This can be configured in ODBC data sources, in ODBC connection attributes, or OLE DB connection properties. DB-Library アプリケーションからの接続に対しては、SET QUOTED_IDENTIFIER は既定で OFF に設定されています。The default for SET QUOTED_IDENTIFIER is OFF for connections from DB-Library applications.

テーブルの作成時に QUOTED IDENTIFIER オプションが OFF に設定されていても、作成されるテーブルのメタデータでは、このオプションは常に ON として格納されます。When a table is created, the QUOTED IDENTIFIER option is always stored as ON in the table's metadata even if the option is set to OFF when the table is created.

ストアド プロシージャを作成すると、SET QUOTED_IDENTIFIER と SET ANSI_NULLS の設定が取得され、以降そのストアド プロシージャを呼び出すときに使用されます。When a stored procedure is created, the SET QUOTED_IDENTIFIER and SET ANSI_NULLS settings are captured and used for subsequent invocations of that stored procedure.

SET QUOTED_IDENTIFIER をストアド プロシージャの内部で実行する場合、この設定は変更されません。When executed inside a stored procedure, the setting of SET QUOTED_IDENTIFIER is not changed.

SET ANSI_DEFAULTS が ON の場合、SET QUOTED_IDENTIFIER は有効になります。When SET ANSI_DEFAULTS is ON, SET QUOTED_IDENTIFIER is enabled.

SET QUOTED_IDENTIFIER は、ALTER DATABASE の QUOTED_IDENTIFIER 設定にも対応します。SET QUOTED_IDENTIFIER also corresponds to the QUOTED_IDENTIFIER setting of ALTER DATABASE. データベースの設定の詳細については、ALTER DATABASE に関するページをご覧ください。For more information about database settings, see ALTER DATABASE.

SET QUOTED_IDENTIFIER は解析時に有効であり、解析に対してのみ影響を与え、クエリの実行には影響しません。SET QUOTED_IDENTIFIER takes effect at parse-time and only affects parsing, not query execution.

最上位のアドホック バッチの場合、解析は QUOTED_IDENTIFIER に対するセッションの現在の設定を使って開始します。For a top-level ad-hoc batch parsing begins using the session's current setting for QUOTED_IDENTIFIER. バッチが解析される過程で、SET QUOTED_IDENTIFIER が出現すると、それ以降の解析動作が変更され、セッションのその設定が保存されます。As the batch is parsed any occurrence of SET QUOTED_IDENTIFIER will change the parsing behavior from that point on, and save that setting for the session. したがって、バッチが解析されて実行された後、セッションの QUOTED_IDENTIFER の設定は、バッチでの SET QUOTED_IDENTIFIER の最後の出現に従って設定されます。So after the batch is parsed and executed, the session's QUOTED_IDENTIFER setting will be set according to the last occurrence of SET QUOTED_IDENTIFIER in the batch.

ストアド プロシージャ内の静的な SQL は、ストアド プロシージャを作成または変更したバッチで有効な QUOTED_IDENTIFIER の設定を使って解析されます。Static SQL in a stored procedure is parsed using the QUOTED_IDENTIFIER setting in effect for the batch that created or altered the stored procedure. SET QUOTED_IDENTIFIER は、静的 SQL としてストアド プロシージャの本体内に出現する場合は効果がありません。SET QUOTED_IDENTIFIER has no effect when it appears in the body of a stored procedure as static SQL.

sp_executesql または exec() を使う入れ子になったバッチの場合、解析はセッションの QUOTED_IDENTIFIER の設定を使って開始します。For a nested batch using sp_executesql or exec() the parsing begins using the QUOTED_IDENTIFIER setting of the session. 入れ子になったバッチがストアド プロシージャの内部にある場合は、解析はストアド プロシージャの QUOTED_IDENTIFIER の設定を使って開始します。If the nested batch is inside a stored procedure the parsing starts using the QUOTED_IDENTIFIER setting of the stored procedure. 入れ子になったバッチが解析される過程で、SET QUOTED_IDENTIFIER が出現すると、それ以降の解析動作が変更されますが、セッションの QUOTED_IDENTIFIER の設定は更新されません。As the nested batch is parsed, any occurrence of SET QUOTED_IDENTIFIER will change the parsing behavior from that point on, but the session's QUOTED_IDENTIFIER setting will not be updated.

識別子を区切るための角かっこ ( [ および ] ) の使用は、QUOTED_IDENTIFIER オプションの設定に影響されません。Using brackets, [ and ], to delimit identifiers is not affected by the QUOTED_IDENTIFIER setting.

この設定の現在の設定を表示するには、次のクエリを実行します。To view the current setting for this setting, run the following query.

DECLARE @QUOTED_IDENTIFIER VARCHAR(3) = 'OFF';
IF ( (256 & @@OPTIONS) = 256 ) SET @QUOTED_IDENTIFIER = 'ON';
SELECT @QUOTED_IDENTIFIER AS QUOTED_IDENTIFIER;

アクセス許可Permissions

public ロールのメンバーシップが必要です。Requires membership in the public role.

使用例Examples

A.A. 引用符で囲まれた識別子の設定と、予約済みキーワードを用いたオブジェクト名を使用するUsing the quoted identifier setting and reserved word object names

次の例では、予約済みキーワード名を含むオブジェクト名を作成して使用するときに、SET QUOTED_IDENTIFIER の設定を ON にして、テーブル名のキーワードを二重引用符で区切る必要があることを示しています。The following example shows that the SET QUOTED_IDENTIFIER setting must be ON, and the keywords in table names must be in double quotation marks to create and use objects that have reserved keyword names.

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.B. 引用符で囲まれた識別子の設定と、単一引用符および二重引用符を使用するUsing the quoted identifier setting with single and double quotation marks

次の例では、SET QUOTED_IDENTIFIERON に設定した場合と OFF に設定した場合のそれぞれに対して、文字列式で単一引用符と二重引用符を使用する方法を示しています。The following example shows the way single and double quotation marks are used in string expressions with SET QUOTED_IDENTIFIER set to ON and OFF.

SET QUOTED_IDENTIFIER OFF;
GO
USE AdventureWorks2012;
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_NAME = 'Test')
    DROP TABLE dbo.Test;
GO
USE AdventureWorks2012;
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

以下に結果セットを示します。Here is the result set.

 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

参照See Also