数据库标识符

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsMicrosoft Fabric中的SQL分析端点Microsoft Fabric中的仓库Microsoft Fabric中的SQL数据库

数据库对象名称是它的标识符。

服务器、数据库和数据库对象(例如表、视图、列、索引、触发器、过程、约束及规则等)都可以有标识符。 大多数对象都需要标识符,但某些对象(如约束)使它们成为可选对象。

定义对象时创建对象标识符。 使用标识符引用对象。 例如,下列语句创建一个标识符为 TableX的表,该表中有两列的标识符分别是 KeyCol 和 Description:

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

此表具有未命名的约束。 主键约束没有用户指定的标识符,因此系统会为其分配一个生成的名称,例如 PK__TableX__D7CB9CCCEEF0806C。 可以在sys.key_constraints等系统元数据视图中查看此名称。

约束名称和其他架构范围内的对象在数据库架构中必须是唯一的。 例如,两个主要键约束不能共享名称。 不过,列名只需在每个表内唯一,无需在整个架构内唯一。

标识符的排序规则取决于定义标识符的级别。

  • 实例的默认排序规则被分配给实例级对象的标识符,例如登录名和数据库名称。

  • 数据库的默认排序规则会应用于数据库中对象(如表、视图和列名)的标识符。 例如,可以创建两个名称不同的表,这些表的名称仅在具有区分大小写的排序规则的数据库中不同,但不能在不区分大小写的排序规则的数据库中创建它们。

Note

变量的名称或函数和存储过程的参数必须符合Transact-SQL标识符的规则。

标识符的种类

有两类标识符:

  • 常规标识符 符合标识符的格式规则。 在 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]。

双引号分隔的标识符

双引号分隔的标识符用双引号 (") 括起来。 如果标识符本身包含双引号,请通过将其重复一次来转义 ("")。

双引号分隔符需要 SET QUOTED_IDENTIFIER ON (大多数连接的默认值)。 当 QUOTED_IDENTIFIER 为 OFF 时,数据库引擎将双引号字符串视为字符串文本而不是标识符。 有关详细信息,请参阅 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 中定义的字母包括拉丁字符 a 至 z 和 A 至 Z,以及来自其他语言的字母字符。

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

      标识符开头的某些符号在数据库引擎中具有特殊含义。 以 @ 符号开头的常规标识符始终表示局部变量或参数,并且不能用作任何其他类型的对象的名称。 以一个数字符号开头的标识符表示临时表或过程。 以两个数字符号 (##) 开头的标识符表示全局临时对象。 尽管数字符号或双号符号字符可用于开始其他类型的对象的名称,但应避免这种做法。

      某些Transact-SQL函数的名称以双符号开头(@@)。 为了避免与这些函数混淆,请勿使用以 @@. 开头的名称。

  2. 后续字符可以包括以下列表:

    • Unicode 标准 3.2 定义的字母。

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

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

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

  4. 请勿使用嵌入空格或特殊字符。

  5. 请勿使用 补充字符。

在Transact-SQL语句中使用标识符时,使用双引号或括号分隔不符合这些规则的标识符。 其中一些规则因数据库 兼容性级别而异。

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

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

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

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

Fabric中 SQL 数据库的默认排序规则为 SQL_Latin1_General_CP1_CI_AS。 可以在部署时配置不同的排序规则,但在创建数据库后无法更改它。 各个列可以使用自己的排序规则。 有关部署选项的详细信息,请参阅 在 Fabric 中创建 SQL 数据库的选项。