数据库对象名称是它的标识符。
服务器、数据库和数据库对象(例如表、视图、列、索引、触发器、过程、约束及规则等)都可以有标识符。 大多数对象都需要标识符,但某些对象(如约束)使它们成为可选对象。
定义对象时创建对象标识符。 使用标识符引用对象。 例如,下列语句创建一个标识符为 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标识符的规则。
第一个字符必须是下列字符之一:
Unicode 标准 3.2 定义的字母, Unicode 中定义的字母包括拉丁字符
a至z和A至Z,以及来自其他语言的字母字符。下划线 (
_)、@符号或数字符号 (#)。标识符开头的某些符号在数据库引擎中具有特殊含义。 以 @ 符号开头的常规标识符始终表示局部变量或参数,并且不能用作任何其他类型的对象的名称。 以一个数字符号开头的标识符表示临时表或过程。 以两个数字符号 (
##) 开头的标识符表示全局临时对象。 尽管数字符号或双号符号字符可用于开始其他类型的对象的名称,但应避免这种做法。某些Transact-SQL函数的名称以双符号开头(
@@)。 为了避免与这些函数混淆,请勿使用以@@. 开头的名称。
后续字符可以包括以下列表:
Unicode 标准 3.2 定义的字母。
基本拉丁字符或其他国家/地区字符中的十进制数字。
@符号、美元符号 ($)、数字符号 (#) 或下划线 (_)。
标识符不能是Transact-SQL保留字。 数据库引擎保留了保留字的大写和小写版本。 在Transact-SQL语句中使用标识符时,使用双引号或括号分隔不符合这些规则的标识符。 保留字依赖于数据库兼容级别。 使用 ALTER DATABASE 兼容级别 语句设置数据库兼容性级别。
请勿使用嵌入空格或特殊字符。
请勿使用 补充字符。
在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 数据库的选项。