データベース識別子

適用対象: SQL Server Azure SQL データベース Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric の SQL 分析エンドポイント Microsoft Fabric のウェアハウス

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

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

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

このテーブルには名前のない制約も含まれます。 PRIMARY KEY 制約には識別子がありません。

識別子の照合順序は、識別子が定義されているレベルによって異なります。 ログイン名やデータベース名など、インスタンスレベルのオブジェクトの識別子には、インスタンスの既定の照合順序が指定されます。 テーブル名、ビュー名、列名など、データベース内のオブジェクトの識別子には、データベースの既定の照合順序が指定されます。 たとえば、大文字と小文字を区別する照合順序が指定されたデータベースでは、同じ名前で大文字と小文字のみが異なる 2 つのテーブルを作成できますが、大文字と小文字を区別しない照合順序が指定されたデータベースでは作成できません。

Note

変数名、関数およびストアド プロシージャのパラメーター名は、Transact-SQL 識別子の規則に従っている必要があります。

識別子のクラス

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

  • 標準識別子は、識別子の形式に関する規則に準拠しています。 Transact-SQL ステートメントで使用するときは、標準識別子を区切る必要はありません。

    USE AdventureWorks2022;
    GO
    
    SELECT *
    FROM HumanResources.Employee
    WHERE NationalIDNumber = 153479919;
    
  • 区切られた識別子は、二重引用符 (") または括弧 ([]) で囲まれています。 識別子の形式に関する規則に従っている識別子は、区切らなくてもかまいません。 次に例を示します。

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

識別子の規則に従わない識別子を Transact-SQL ステートメントで使用する場合は、必ず区切らなければなりません。 次に例を示します。

USE AdventureWorks2022;
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 文字以下でなければなりません。

標準識別子に関する規則

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

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

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

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

      SQL Server では、識別子の先頭にある一定の記号には特別な意味があります。 アット マークで始まる標準識別子は、常にローカル変数またはローカル パラメーターを表し、他の種類のオブジェクトの名前としては使用できません。 番号記号で始まる識別子は一時テーブルまたは一時プロシージャを表します。 2 つの番号記号 (##) で始まる識別子は、グローバルな一時オブジェクトを表します。 1 つまたは 2 つの番号記号で始まる名前を、他の種類のオブジェクトの名前として使用することもできますが、このような番号記号の使用はお勧めしません。

      一部の Transact-SQL 関数の名前は、2 つのアット マーク (@@) から始まります。 これらの関数との混同を避けるために、@@ から始まる名前は使用しないでください。

  2. 名前の先頭以外では、次の一覧の文字を使用できます。

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

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

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

  3. Transact-SQL 予約語を識別子として使用することはできません。 SQL Server の予約語は、大文字、小文字ともに予約されています。 これらの規則に従っていない識別子を Transact-SQL ステートメントで使用する場合は、二重引用符または括弧で区切る必要があります。 予約語は、データベースの互換性レベルによって異なります。 互換性レベルは、 ALTER データベース互換レベル ステートメントを使用して設定できます。

  4. 埋め込み型スペースおよび特殊文字は使用できません。

  5. 補助文字は使用できません。

これらの規則に従っていない識別子を Transact-SQL ステートメントで使用する場合は、二重引用符または括弧で区切る必要があります。

Note

標準識別子の形式に関する規則は、データベースの互換性レベルに応じて異なります。 互換性レベルは、ALTER データベース互換レベルを使用して設定できます。

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

Azure SQL データベースでは論理サーバーの照合順序を変更または設定することはできません。 ただし、各データベースの照合順序は、データベース内のデータとカタログ用に個別に構成できます。 カタログの照合順序は、オブジェクト識別子などのシステム メタデータの照合順序を決定します。 Azure portal でデータベースを作成するとき、T-SQL で CREATE DATABASE を使用するとき、PowerShell で New-AzSqlDatabase を使用するときに、両方の照合順序を個別に指定できます。

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