sql语句中方括号[]的用途是什么?


163

我注意到Visual Studio 2008在sql中的列名周围放置了方括号。支架有什么优势吗?当我编写代码T-SQL时,我再也不会打扰他们。

例:

视觉工作室:

SELECT [column1], [column2] etc...

我自己的方式:

SELECT column1, column2 etc...

手工编写的SQL从来不需要括号是一件好事,您的数据库命名约定应排除需要括号的名称。
Christian Oudard

相关答案讨论QUOTED_IDENTIFIER设置:stackoverflow.com/questions/19657101/...
贾里德·贝克

8
我可能会加上方括号是微软的怪癖。SQL标准实际上使用双引号("),Microsoft 支持。如果Microsoft认为需要对所有内容进行定界,那么最好使用标准的双引号代替它。但是我想这会使移植到另一个DBMS变得太容易了,而且永远做不到……
Manngo

Answers:


181

如果您在列名称或标识符中使用关键字或特殊字符,则必须使用方括号。您可以命名一列[First Name](带有空格)-但随后每次引用该列时都需要使用方括号。

较新的工具将它们添加到各处,以防万一或保持一致性。


3
这是方括号的唯一目的吗?

1
@mehow,似乎是这样,但是我没有明确指出的参考。
Michael Haren


2
sql还在select查询的like运算符中使用方括号来限制使用正则表达式的结果。codeproject.com/Articles/33941/SQL-LIKE-Operator
Jens Frandsen

2
您也可以定义一个名为的列名,selectselect select from mytable会引发错误,因此select [select] from mytable使其成为有效的查询。无论您的SQL Management Studio中的单词是彩色的,如果要将其用作列/表/ sp /等名称,都应使用方括号括起来。在MySQL中,斜角单引号``''等效于此。
巴里·古文卡亚

59

如果您的列与SQL关键字具有相同的名称或在其中包含空格,则它们很方便。

例:

create table test ( id int, user varchar(20) )

不好了!关键字“用户”附近的语法不正确。但是这个:

create table test ( id int, [user] varchar(20) )

工作良好。


@Blordbeard是Microsoft SQL Server特有的东西吗,或者方括号对Oracle,mySQL,PostgreSQL等也起作用吗?
user3700562

4
括号不是标准的SQL,不确定所有DB引擎使用什么字符。例如:MySQL使用反引号:stackoverflow.com/questions/2889871/...
Blorgbeard超出

12

如果您(出于某种原因)使用带有某些字符的列名,则它们很有用。

Select First Name From People

将不起作用,但在列名周围放置方括号将起作用

Select [First Name] From People

简而言之,这是一种显式声明对象名称的方法。列,表,数据库,用户或服务器。


6

列名可以包含字符和保留字,这会使查询执行引擎感到困惑,因此始终在其周围放置方括号可防止这种情况发生。我想比检查问题然后处理它更容易。


5

当列名是保留字时,可以使用方括号。

如果您是通过编程方式从不受控制的列名集合中生成SQL语句,则可以始终使用方括号来避免出现问题。


5

不管遵循避免使用保留字的命名约定,Microsoft都会添加新的保留字。使用方括号可以将您的代码升级到新的SQL Server版本,而无需首先从客户端代码中编辑Microsoft新保留的单词。编辑可能是一个重大问题。这可能会导致您的项目过早退休。

当您想在脚本中替换全部时,方括号也很有用。如果您的批处理包含名为@String的变量和名为[String]的列,则可以将列重命名为[NewString],而无需将@String重命名为@NewString。


5

在1990年代SQL的黑暗时代,这是一个好习惯,因为SQL设计人员正试图将字典中的每个单词添加为无休止的新功能的关键词,他们将其称为SQL3草案。

因此,它保持了向前的兼容性。

而且我发现它还有另一个不错的副作用,当您在代码审查和重构中使用grep时,它会很有帮助。


4

此外,某些Sharepoint数据库的名称中包含连字符。在SQL语句中使用方括号可正确解析名称。


3

我相信它将它们添加到那里是为了保持一致……仅当您在列名称中使用空格或特殊字符时才需要使用它们,但是在IDE生成SQL时始终将它们始终包含会更干净。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.