次の方法で共有


データベース識別子

対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric の SQL 分析エンドポイントMicrosoft Fabric のデータウェアハウスMicrosoft Fabric の SQL データベース

データベース オブジェクト名は、その識別子です。

サーバーやデータベース、またはテーブル、ビュー、列、インデックス、トリガー、プロシージャ、制約、規則などのデータベース オブジェクトに対して識別子を割り当てることができます。 ほとんどのオブジェクトには識別子が必要ですが、制約などの一部のオブジェクトでは省略可能です。

オブジェクトを定義するときに、オブジェクト識別子を作成します。 識別子を使用してオブジェクトを参照します。 たとえば、次のステートメントは識別子が TableXであるテーブル 1 つと、識別子がそれぞれ KeyColDescriptionである 2 つの列を作成します。

CREATE TABLE TableX
(
    KeyCol INT PRIMARY KEY,
    Description NVARCHAR (80)
);

このテーブルには、名前のない制約があります。 主キー制約にはユーザー指定の識別子がないため、システムは生成された名前 ( PK__TableX__D7CB9CCCEEF0806C など) を割り当てます。 この名前は、 sys.key_constraints などのシステム メタデータ ビューで確認できます。

制約名とその他のスキーマ スコープ オブジェクトは、データベース スキーマ内で一意である必要があります。 たとえば、2 つの主キー制約で名前を共有することはできません。 ただし、列名はスキーマ内ではなく、各テーブル内でのみ一意である必要があります。

識別子の照合順序は、定義するレベルによって異なります。

  • インスタンスの既定の照合順序は、ログインやデータベース名など、インスタンス レベルのオブジェクトの識別子に割り当てられます。

  • データベースの既定の照合順序は、テーブル、ビュー、列名など、データベース内のオブジェクトの識別子に割り当てられます。 たとえば、大文字と小文字を区別する照合順序を持つデータベースでは、大文字と小文字のみが異なる名前の 2 つのテーブルを作成できますが、大文字と小文字を区別しない照合順序を持つデータベースでは作成できません。

Note

変数の名前、または関数とストアド プロシージャのパラメーターは、Transact-SQL識別子の規則に従う必要があります。

識別子のクラス

識別子のクラスには、次の 2 種類があります。

  • 通常の識別子は、識別子 の形式規則に準拠しています。 Transact-SQL ステートメントで使用する場合、これらの区切り記号は使用されません。 通常の識別子は、 通常の識別子の規則に従う必要があります。文字、数字、および特定の記号 (_@#$) のみを含めることができます。文字または _@#で始まる必要があり、予約語にすることはできません。

    USE AdventureWorks2025;
    GO
    
    SELECT *
    FROM HumanResources.Employee
    WHERE NationalIDNumber = 153479919;
    
  • 区切られた識別子は、二重引用符 (") または括弧 ([]) で囲まれています。 区切り記号を使用すると、予約キーワード、スペースを含む名前、特殊文字を含む名前など、通常の識別子として無効な名前を使用できます。 通常の識別子規則に既に準拠している識別子も区切ることができますが、その場合、区切り記号は省略可能です。 詳細については、「 区切り識別子の規則」を参照してください。

    USE AdventureWorks2025;
    GO
    
    SELECT *
    FROM [HumanResources].[Employee] --Delimiter is optional.
    WHERE [NationalIDNumber] = 153479919; --Delimiter is optional.
    

通常の識別子の規則に準拠していない識別子は、Transact-SQL ステートメントで区切る必要があります。 例えば次が挙げられます。

USE AdventureWorks2025;
GO

--Identifier contains a space and uses a reserved keyword.
CREATE TABLE [SalesOrderDetail Table]
(
    [Order] INT NOT NULL,
    [SalesOrderDetailID] INT IDENTITY (1, 1) NOT NULL,
    [OrderQty] SMALLINT NOT NULL,
    [ProductID] INT NOT NULL,
    [UnitPrice] MONEY NOT NULL,
    [UnitPriceDiscount] MONEY NOT NULL,
    [ModifiedDate] DATETIME NOT NULL,
    CONSTRAINT [PK_SalesOrderDetail_Order_SalesOrderDetailID] PRIMARY KEY CLUSTERED
    (
        [Order] ASC,
        [SalesOrderDetailID] ASC
    )
);
GO

SELECT *
FROM [SalesOrderDetail Table] --Identifier contains a space and uses a reserved keyword.
WHERE [Order] = 10; --Identifier is a reserved keyword.

標準識別子および区切られた識別子は、文字、記号 (_ @ #)、および数字を含む 1 ~ 128 個の文字で構成されます。 ローカル一時テーブルの場合、識別子は 116 文字以下でなければなりません。

区切り識別子の規則

区切られた識別子は、角かっこ ([]) または二重引用符 (") で囲まれます。 通常の識別子では使用できないスペース、予約済みキーワード、特殊文字など、任意の組み合わせの文字を含めることができます。

角かっこで区切られた識別子

角かっこで区切られた識別子は、角かっこ ([]) で囲まれます。 識別子自体に右角かっこ (]) が含まれている場合は、(]]) を重ねることでエスケープします。 左括弧 ([) はエスケープする必要がありません。

たとえば、名前に角かっこが含まれるテーブルを作成してクエリを実行するには、次のようにします。

-- Create a table with a ] character in its name.
CREATE TABLE [My]]Table]
(
    ID INT PRIMARY KEY
);
GO

-- Reference the table in a query.
SELECT *
FROM [My]]Table];
GO

QUOTENAME関数は、指定された文字列の有効な角かっこで区切られた識別子を返し、エスケープ処理を自動的に処理します。

SELECT QUOTENAME('abc[]def');

前の例では、 [abc[]]def]が返されます。

二重引用符で区切られた識別子

二重引用符で区切られた識別子は、二重引用符 (") で囲まれます。 識別子自体に二重引用符が含まれている場合は、二重引用符 ("") を 2 倍にしてエスケープします。

二重引用符区切り記号には SET QUOTED_IDENTIFIER ON が必要です (ほとんどの接続の既定値)。 QUOTED_IDENTIFIEROFF の場合、データベース エンジンは二重引用符で囲まれた文字列を識別子の代わりに文字列リテラルとして扱います。 詳細については、「SET QUOTED_IDENTIFIER」を参照してください。

たとえば、予約済みキーワードを識別子として使用するテーブルを作成してクエリを実行するには、次のようにします。

SET QUOTED_IDENTIFIER ON;
GO

-- Create a table using double-quote delimiters.
CREATE TABLE "My Table"
(
    "Order" INT NOT NULL,
    "Description" NVARCHAR (100)
);
GO

SELECT "Order",
       "Description"
FROM "My Table";
GO

Note

SET QUOTED_IDENTIFIER は、角かっこで区切られた識別子には影響しません。 角かっこ区切り記号は、 QUOTED_IDENTIFIER 設定に関係なく常に機能します。

標準識別子に関する規則

変数、関数、およびストアド プロシージャの名前は、Transact-SQL識別子のこれらの規則に従う必要があります。

  1. 最初の文字は、次のいずれかの文字である必要があります。

    • Unicode 規格 3.2 で定義されている文字。 Unicode の文字定義には、各国言語の文字の他に、ラテン文字 azAZ も含まれます。

    • アンダースコア (_)、アット マーク (@)、または番号記号 (#)。

      識別子の先頭にある特定のシンボルは、データベース エンジンで特別な意味を持ちます。 アット マークで始まる標準識別子は、常にローカル変数またはローカル パラメーターを表し、他の種類のオブジェクトの名前としては使用できません。 番号記号で始まる識別子は一時テーブルまたは一時プロシージャを表します。 2 つの番号記号 (##) で始まる識別子は、グローバルな一時オブジェクトを表します。 他の種類のオブジェクトの名前を開始するには、番号記号または二重番号記号文字を使用できますが、この方法は避ける必要があります。

      一部のTransact-SQL関数には、二重記号 (@@) で始まる名前があります。 これらの関数との混乱を避けるために、 @@で始まる名前を使用しないでください。

  2. 次の一覧の文字を含めることができます。

    • Unicode 規格 3.2 で定義されている文字

    • Basic Latin スクリプトまたはその他の各国スクリプトの 10 進数の数値

    • アット マーク (@)、ドル記号 ($)、番号記号 (#)、またはアンダースコア (_)。

  3. 識別子は、Transact-SQL予約語にすることはできません。 データベース エンジンは、予約語の大文字と小文字の両方のバージョンを予約します。 Transact-SQLステートメントで識別子を使用する場合は、二重引用符または角かっこを使用して、これらの規則に準拠していない識別子を区切ります。 予約語は、データベースの互換性レベルによって異なります。 ALTER DATABASE 互換性レベル ステートメントを使用して、 データベース互換性レベル を設定します。

  4. 埋め込みスペースや特殊文字は使用しないでください。

  5. 補助文字は使用しないでください。

Transact-SQLステートメントで識別子を使用する場合は、二重引用符または角かっこを使用して、これらの規則に準拠していない識別子を区切ります。 これらの規則の一部は、データベース の互換性レベルによって異なります。

Azure SQL Databaseでのカタログ照合順序

Azure SQL Databaseで論理サーバーの照合順序を変更または設定することはできません。 ただし、各データベースの照合順序は、データベース内のデータとカタログ用に個別に構成できます。 カタログの照合順序は、オブジェクト識別子などのシステム メタデータの照合順序を決定します。 Azure ポータル、Transact-SQL (T-SQL) の CREATE DATABASE コマンド、または PowerShell の New-AzSqlDatabase コマンドを用いてデータベースを作成する際に、それぞれの照合順序を個別に指定することができます。

詳細と例については、「CREATE DATABASE」を参照してください。 データ (COLLATE) の照合順序と、システム メタデータとオブジェクト識別子 (CATALOG_COLLATION) のカタログ照合順序を指定します。

Microsoft Fabric の SQL データベースのカタログ照合順序

Fabric の SQL データベースの既定の照合順序は、SQL_Latin1_General_CP1_CI_AS です。 配置時に別の照合順序を構成することはできますが、データベースの作成後に変更することはできません。 個々の列では、独自の照合順序を使用できます。 デプロイ オプションの詳細については、「Options」を参照して、Fabric に SQL データベースを作成します。