区切られた識別子 (データベース エンジン)

識別子の形式に関するすべての規則に従う識別子では、区切り記号を任意に使用できます。標準識別子の形式に関する規則に従わない識別子は、必ず区切り記号で区切る必要があります。

注意注意

MicrosoftSQL Server では、区切られた変数名およびストアド プロシージャ パラメータは認識されません。このようなタイプの識別子は、標準識別子の規則に従う必要があります。

次の場合に、区切られた識別子を使用します。

  • オブジェクト名またはオブジェクト名の一部に予約語を使用する場合。

    予約キーワードをオブジェクト名として使用しないでください。データベースを SQL Server の旧バージョンからアップグレードした場合、データベースに含まれている識別子は、旧バージョンで予約語でなくても SQL Server の現在のバージョンでは予約語になっている可能性があります。名前を変更するまでは、区切られた識別子を使用してオブジェクトを参照できます。

  • 修飾された識別子として示されていない文字を使用する場合。

    SQL Server では、現在のコード ページ内のすべての文字を、区切られた識別子で使用できます。しかし、オブジェクト名で特殊文字を区別しないで使用すると、SQL ステートメントやスクリプトの読み取りとメンテナンスが難しくなることがあります。たとえば、Employee] という名前のテーブルを作成するとします。ここで、閉じ角かっこ (]) は名前の一部です。これを行うには、次のように角かっこをあと 2 つ使用して、閉じ角かっこをエスケープする必要があります。

    CREATE TABLE [Employee]]] 
    (
    EmployeeID int IDENTITY (1,1) NOT NULL,
    FirstName varchar(30),
    LastName varchar(30)
    );
    
注意注意

区切り記号は識別子のみに使用します。区切り記号は、SQL Server での予約の有無に関係なくキーワードには使用できません。

区切り記号の種類

Transact-SQL で使用する区切り記号の種類は次のとおりです。

  • 引用符で区切る場合は、二重引用符 (") を使用します。

    SELECT * FROM "Blanks in Table Name";
    
  • かっこで区切る場合は、角かっこ ([ ]) を使用します。

    SELECT * FROM [Blanks In Table Name];
    

引用符で囲まれた識別子は、QUOTED_IDENTIFIER オプションが ON に設定された場合のみ有効です。既定では、Microsoft OLE DB Provider for SQL Server と SQL Server ODBC ドライバは、接続時に QUOTED_IDENTIFIER を ON に設定します。

どちらのインターフェイスを使用するかに関係なく、個々のアプリケーションまたはユーザーはいつでも設定を変更できます。SQL Server では、このオプションを指定するためのさまざまな方法があります。たとえば、SQL Server Management Studio では、このオプションをダイアログ ボックスで設定できます。Transact-SQL では、SET QUOTED_IDENTIFIER、ALTER DATABASE の QUOTED_IDENTIFIER オプション、または sp_configure の user options オプションを使用して、さまざまなレベルでオプションを設定できます。

QUOTED_IDENTIFIER オプションが ON に設定されている場合、SQL Server は SQL ステートメント内での二重引用符 (") と単一引用符 (') の使用について ISO 規則に従います。次に例を示します。

  • 二重引用符は識別子を区切るためだけに使用できます。文字列の区切り記号として二重引用符を使用することはできません。

    既存のアプリケーションとの互換性を保つため、SQL Server では、この規則をそれほど厳密には適用していません。文字列が識別子の長さを超えない場合は、文字列を二重引用符で囲むことができます。しかし、このような二重引用符の使用はお勧めしません。

  • 文字列は単一引用符で区切る必要があります。識別子の区切り記号として単一引用符を使用することはできません。

    文字列に埋め込み型単一引用符が含まれている場合、埋め込み型単一引用符の前にさらにもう 1 つ単一引用符を追加する必要があります。次に例を示します。

    SELECT * FROM "My Table"
    WHERE "Last Name" = 'O''Brien';
    

QUOTED_IDENTIFIER が OFF に設定されている場合は、SQL Server では単一引用符および二重引用符に次の規則を使用します。

  • 識別子を区切るとき、引用符を使用することはできません。区切り記号として、引用符ではなく角かっこを使用する必要があります。

  • 文字列を囲むとき、単一引用符と二重引用符のいずれかを使用できます。

    二重引用符を使用する場合、埋め込み型単一引用符を 2 つの単一引用符で表す必要はありません。次に例を示します。

    SELECT * FROM [My Table]
    WHERE [Last Name] = "O'Brien";
    

角かっこで囲む区切り記号は、QUOTED_IDENTIFIER オプションの設定に関係なくいつでも使用できます。

区切られた識別子に関する規則

区切られた識別子の形式に関する規則は、次のとおりです。

  • 区切られた識別子には、標準識別子と同じ文字数を含めることができます。つまり、区切り記号を除いた 1 ~ 128 文字で構成できます。ローカル一時テーブル識別子は、116 文字以下でなければなりません。

  • 識別子の本体は、区切り記号を除き、現在のコード ページ内にある文字の任意の組み合わせで構成されます。たとえば、区切られた識別子には、スペースを含む、標準識別子として有効なすべての文字、および次に示す文字のどれでも使用できます。

    チルダ (~)

    ハイフン (-)

    感嘆符 (!)

    左中かっこ ({)

    パーセント (%)

    右中かっこ (})

    キャレット (^)

    アポストロフィ (')

    アンパサンド (&)

    ピリオド (.)

    左かっこ (()

    円記号 (\)

    右かっこ ())

    アクセント符号 (`)

  • オブジェクトに名前を付け、そのオブジェクト名の末尾にスペースがあるときに、区切られた識別子を使用すると、SQL Server では末尾のスペースを含む名前が保存されます。識別子名の比較には、文字列の比較と同じセマンティクスが使用されることに注意してください。つまり、末尾にあるスペースは無視されます。ただし、将来の互換性の問題を避けるために、区切り記号で囲まれたすべての文字で 1 つの識別子名と見なし、オブジェクトを参照する際には一貫して区切られた識別子名を使用することをお勧めします。

次の例では、テーブル名と列名に、引用符で囲まれた識別子が使用されています。区切られた識別子を指定する 2 つの方法を次に示します。

SET QUOTED_IDENTIFIER ON;
GO
CREATE TABLE "$Employee Data"
(
 "^First Name"   varchar(25) NOT NULL,
 "^Last Name"   varchar(25) NOT NULL,
 "^Dept ID"   int
);
GO

-- INSERT statements go here.
SET QUOTED_IDENTIFIER OFF;
GO
CREATE TABLE [^$Employee Data]
(
 [^First Name]   varchar(25) NOT NULL,
 [^Last Name]   varchar(25) NOT NULL,
 [^Dept ID]   int
);
GO
-- INSERT statements go here.

$Employee Data と ^$Employee Data の各テーブルを作成し、データを入力したら、次のように列を取得できます。

SET QUOTED_IDENTIFIER ON;
GO
SELECT * 
FROM "$Employee Data"
SET QUOTED_IDENTIFIER OFF;
GO
-- Or
SELECT *
FROM [^$Employee Data]

次の例では、table という名前のテーブルに、tablename、user、select、insert、update、および delete という列が含まれています。TABLE、SELECT、INSERT、UPDATE、および DELETE という語は予約キーワードなので、これらのオブジェクトにアクセスするたびに、識別子を区切る必要があります。

SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE "table"
(
 tablename char(128) NOT NULL,
 "USER"    char(128) NOT NULL,
 "SELECT"  char(128) NOT NULL,
 "INSERT"  char(128) NOT NULL,
 "UPDATE"  char(128) NOT NULL,
 "DELETE"  char(128) NOT NULL
);
GO

SET QUOTED_IDENTIFIER オプションが ON に設定されていない場合、区切り記号の角かっこを使用しない限り、テーブルと列にはアクセスできません。次に例を示します。

SET QUOTED_IDENTIFIER OFF;
GO
SELECT * 
FROM "table";
GO

以下に結果セットを示します。:

Msg 170, Level 15, State 1
Line 1: Incorrect syntax near 'table'.

角かっこの区切り記号を使用すると、次のようになります。

SET QUOTED_IDENTIFIER OFF;
GO
SELECT * 
FROM [table];
GO

複数の部分に区切られた識別子

修飾されたオブジェクト名を使用する際に、場合によってはオブジェクト名を構成している複数の識別子を区切る必要があります。各識別子をそれぞれ区切る必要があります。次に例を示します。

/* ISO quoted identifier syntax */
SELECT *
FROM "My DB"."My#UserID"."My.Table";
GO

または

/* Transact-SQL bracketed identifier syntax */
/* Not available in SQL Server 6.5 or earlier */
SELECT *
FROM [My DB].[My#UserID].[My.Table];
GO

ODBC CALL ステートメントにある、マルチパート ストアド プロシージャ名を区切る方法に関しては、特別な規則があります。詳細については、「ストアド プロシージャの呼び出し」を参照してください。

SQL Server のパラメータとしての識別子の使用

多くのシステム ストアド プロシージャ、関数、および DBCC ステートメントは、パラメータとしてオブジェクト名を必要とします。これらのパラメータには、マルチパート オブジェクト名を受け入れるものもあれば、ただ 1 つの要素で構成される名前を受け入れるものもあります。1 つの要素で構成される名前と複数の要素で構成される名前のどちらを想定するのかによって、パラメータをどのように解析し、SQL Server がどのようにこれらのパラメータを内部的に使用するのかが決まります。

1 つの要素で構成されるパラメータ名

パラメータが 1 つの要素で構成される識別子である場合、次のように名前を指定できます。

  • 引用符や区切り記号を使用しない。

  • 単一引用符で囲む。

  • 二重引用符で囲む。

  • 角かっこで囲む。

1 つの要素で構成される名前の場合、単一引用符で囲んだ文字列はオブジェクト名を表します。区切り記号を単一引用符で囲んだ場合、区切り記号は名前の一部として扱われます。

名前にピリオドや標準識別子に対して定義された文字セットに含まれない文字が含まれている場合、オブジェクト名を単一引用符、二重引用符、または角かっこで囲む必要があります。

マルチパート パラメータ名

マルチパート名は、オブジェクト名の他に、データベース名やスキーマ名を含む修飾名です。SQL Server では、マルチパート名をパラメータとして使用する場合、マルチパート名を構成する文字列全体を 1 組の単一引用符で囲む必要があります。

EXEC MyProcedure @name = 'dbo.Employees';

名前の各要素を区切り記号で区切る必要がある場合、必要に応じて、名前の各要素を個別に区切ります。たとえば、名前の要素にピリオド、二重引用符、左または右角かっこのいずれかが含まれる場合、角かっこまたは二重引用符を使用して、その要素を区切ります。名前全体は単一引用符で囲みます。

たとえば、tab.one というテーブル名にはピリオドが含まれています。この名前が dbo.tab.one という 3 つの要素で構成される名前として解釈されないようにするには、テーブル名の部分を区切ります。

EXEC sp_help 'dbo.[tab.one]';

次の例は、同じテーブル名を二重引用符で区切った名前を示します。

SET QUOTED_IDENTIFIER ON; 
GO 
EXEC sp_help 'dbo."tab.one"';
GO 

変更履歴

変更内容

「区切られた識別子に関する規則」の説明を、末尾のスペースも含めてオブジェクト名が保存されるという記述に修正しました。また、区切られたオブジェクト名を使用する際の推奨事項を追加しました。