为什么我们可以指定用 [] 括起来的表名

Rag*_*ock 5 sql-server

有什么理由可以用 [schema].[tableName] 而不是 schema.tablename 来指定表名吗?

是它JUST允许在表名的空间?

Rac*_*hel 16

它们被称为Delimited Identifiers,它们的主要目的是允许在表名中使用特殊字符和关键字/作为表名

例如,某个天才决定我使用的数据库中主表的名称是master,这是一个关键字。

除了在这些情况下,它们真的根本不需要。

  • 我继承了许多“天才”创造的系统。 (4认同)

Aar*_*and 11

它们对不“友好”的名称进行转义 - 如果您的数据库名称包含特殊字符(如空格、点或破折号)或代表 SQL 关键字(如 USE 或 DATABASE :-)),它们会很有用。如果没有方括号,这样的查询将失败:

SELECT column FROM database.dbo.table;
Run Code Online (Sandbox Code Playgroud)

但是,如果您以这种方式编写查询,关键字将被忽略:

SELECT [column] FROM [database].dbo.[table];
Run Code Online (Sandbox Code Playgroud)

在构建脚本或编写从元数据生成脚本的解决方案时(例如生成所有表或所有索引的脚本),我总是将实体名称括在方括号中,这样无论实现了什么样的奇怪名称,它们都可以工作(我是对于我控制的系统,并不总是这样做)。您可以使用QUOTENAME函数轻松完成此操作,例如:

SELECT QUOTENAME('table'), QUOTENAME('column'), QUOTENAME('database');
Run Code Online (Sandbox Code Playgroud)

结果:

[table] [column] [database]
Run Code Online (Sandbox Code Playgroud)

如果您在此处和 Stack Overflow 上搜索我的答案,QUOTENAME您会发现我在许多脚本中使用它,我正在帮助人们自动化脚本生成或构建动态 SQL。如果没有方括号,很多人会在运行脚本时遇到问题。