資料庫識別碼

適用於:SQL ServerAzure SQL 資料庫Azure SQL 受控執行個體Azure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric 中的 SQL 分析端點Microsoft Fabric 中的倉儲

資料庫物件名稱又稱為識別碼。 Microsoft SQL Server 中的所有內容都可能有識別碼。 伺服器、資料庫與資料庫物件 (如資料表、檢視、資料行、索引、觸發程序、程序、條件約束、規則) 都可以有識別碼。 大多數物件都需要識別碼,但對部分物件如條件約束,則是選擇性的需求。

定義物件時會建立物件識別碼。 之後就可以使用識別碼來參考物件。 例如,以下陳述式會建立具有識別碼 TableX的資料表,以及具有識別碼 KeyColDescription的兩個資料行:

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

這個資料表也有一個未命名的條件約束。 PRIMARY KEY 條件約束沒有識別碼。

識別碼的定序會隨定義的層級而不同。 執行個體層級物件 (如登入和資料庫名稱) 的識別碼會被指派執行個體的預設定序。 而資料庫中物件 (如資料表、檢視和資料行名稱) 的識別碼,則會被指派資料庫的預設定序。 例如,在區分大小寫定序的資料庫中,您可以建立名稱相同但大小寫不同的兩個資料表,但在不區分大小寫定序的資料庫中,就不可以建立名稱相同但大小寫不同的兩個資料表。

注意

變數名稱或函數和預存程序的參數,必須符合 Transact-SQL 識別碼的規則。

識別碼的分類

識別碼分為兩類:

  • 一般識別碼
    符合識別碼格式的規則。 在 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
CREATE TABLE [SalesOrderDetail Table] --Identifier contains a space and uses a reserved keyword.
(
    [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 Standard 3.2 所定義的字母。 Unicode 的字母定義包括從 a 到 z 以及從 A 到 Z 的拉丁字元,還有其他語系中的字母字元。

    • 底線 (_)、@ 符號或數字符號 (#)。

      識別碼開頭的某些符號在 SQL Server 中有特殊意義。 以 @ 符號開頭的一般識別碼代表本機變數或參數,而且不能做為任何其他類型之物件的名稱。 開頭為 # 符號的識別碼代表暫存資料表或程序。 開頭為兩個 ## 符號的識別碼代表全域暫存物件。 雖然 # 符號或兩個 ## 符號字元可做為其他類型之物件的名稱開頭,但是不建議此用法。

      部分 Transact-SQL 功能的名稱會以兩個 @@ 符號為開頭。 為了避免與這些功能產生混淆,不應該使用以 @@ 為開頭的名稱。

  2. 可包含的後續字元如下:

    • Unicode Standard 3.2 所定義的字母。

    • 其他基本拉丁文或其他國家 (地區) 字集中的十進位數字。

    • @ 符號、錢幣符號 ($)、數字符號 (#) 或底線 (_)。

  3. 識別碼不可以是 Transact-SQL 保留字。 SQL Server 會保留大小寫版本的保留字。 在 Transact-SQL 陳述式中使用識別碼時,如果識別碼與上述規則不符,您必須使用雙引號 ("") 或方括號 ([]) 加以分隔。 保留字取決於資料庫相容性層級。 這個層級可以使用 ALTER DATABASE 陳述式加以設定。

  4. 不允許內嵌的空格或特殊字元。

  5. 不允許補充字元

在 Transact-SQL 陳述式中使用識別碼時,如果識別碼與上述規則不符,您必須使用雙引號 ("") 或方括號 ([]) 加以分隔。

注意

某些有關於一般識別碼格式的規則,取決於資料庫的相容性層級。 您可以使用 ALTER DATABASE來設定這個層級。

Azure SQL 資料庫中的目錄定序

您無法在 Azure SQL 資料庫上變更或設定邏輯伺服器定序,但您可以分別針對資料庫和目錄中的資料來設定每個資料庫的定序。 目錄定序會判定系統中繼資料的定序,例如物件識別碼。 當您在 Azure 入口網站、T-SQL (使用 CREATE DATABASE)、PowerShell (使用 New-AzSqlDatabase) 中建立資料庫時,可單獨指定這兩個定序。

如需詳細資訊和範例,請參閱建立資料庫。 指定資料庫的定序 (COLLATE) 和系統中繼資料和物件識別碼的目錄定序 (CATALOG_COLLATION)。

下一步