数据库标识符

适用于: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 标准 3.2 定义的字母, Unicode 中定义的字母包括拉丁字符 a-z 和 A-Z,以及来自其他语言的字母字符。

    • 下划线 (_)、at 符号 (@) 或数字符号 (#)。

      在 SQL Server中,某些位于标识符开头位置的符号具有特殊意义。 以 at 符号开头的常规标识符始终表示局部变量或参数,并且不能用作任何其他类型的对象的名称。 以一个数字符号开头的标识符表示临时表或过程。 以两个数字符号 (##) 开头的标识符表示全局临时对象。 虽然数字符号或两个数字符号字符可用作其他类型对象名的开头,但是我们建议不要这样做。

      某些 Transact-SQL 函数的名称以两个 at 符号 (@@) 开头。 为了避免与这些函数混淆,不应使用以 @@ 开头的名称。

  2. 后续字符可以包括:

    • Unicode 标准 3.2 定义的字母。

    • 基本拉丁字符或其他国家/地区字符中的十进制数字。

    • at 符号 (@)、美元符号 ($)、数字符号 (#) 或下划线 (_)。

  3. 标识符不得是 Transact-SQL 保留字。 SQL Server 保留保留字的大写和小写版本。 在 Transact-SQL 语句中使用标识符时,不符合这些规则的标识符必须由双引号或括号分隔。 保留字依赖于数据库兼容级别。 可通过使用 ALTER DATABASE 语句设置该级别。

  4. 不允许嵌入空格或特殊字符。

  5. 不允许使用增补字符

在 Transact-SQL 语句中使用标识符时,不符合这些规则的标识符必须由双引号或括号分隔。

注意

一些常规标识符格式规则取决于数据库兼容级别。 该级别可以使用 ALTER DATABASE设置。

Azure SQL 数据库中的目录排序规则

不能更改或设置 Azure SQL 数据库的逻辑服务器排序规则,但可以单独配置数据库中数据和目录的排序规则。 目录排序规则确定系统元数据(如对象标识符)的排序规则。 在 Azure 门户中创建数据库、使用 CREATE DATABASE 在 T-SQL 中创建数据库以及使用 New-AzSqlDatabase 在 PowerShell 中创建数据库时,可以单独指定这两种排序规则。

有关详细信息和示例,请参阅 CREATE DATABASE。 为数据库指定排序规则 (COLLATE),并为系统元数据和对象标识符指定目录排序规则 (CATALOG_COLLATION)。

后续步骤