通过


数据库标识符

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric 中的 SQL 分析终结点Microsoft Fabric 中的仓库Microsoft Fabric 中的 SQL 数据库

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

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

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

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_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,以及来自其他语言的字母字符。

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

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

      某些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,或在 PowerShell 中使用 New-AzSqlDatabase

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

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

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