SQL Server中别名的方括号和单引号之间有什么区别?

Fre*_*e2k 25 sql-server quotes alias brackets pointer-aliasing

我看到一些人使用单引号别名列名称,例如:

select orderID 'Order No' from orders
Run Code Online (Sandbox Code Playgroud)

和其他人使用方括号,例如:

select orderID [Order No] from orders
Run Code Online (Sandbox Code Playgroud)

我倾向于使用方括号.有偏好/差异吗?

cod*_*eim 63

要回答"是否有任何偏好/差异"的问题:

是的,有很多偏好和意见一样多,但要小心你采用的偏好.

作为最佳实践,如果不需要任何额外的工作,建议编写可移植的SQL.

对于您的特定示例,编写可移植查询同样容易:

select OrderId as "Order Id" from Orders
Run Code Online (Sandbox Code Playgroud)

写一个非便携式的:

select OrderId as [Order Id] from Orders
Run Code Online (Sandbox Code Playgroud)

当存在相同数量的击键的等效可移植形式时,编写非标准SQL是不合理的.

[]用于转义的扩散是由于像SQL Server Management Studio和MS Access查询构建器这样的工具,它们懒得逃避一切.对于在SQL Server中度过他/她职业生涯的开发人员来说,它可能永远不会发生,但是括号在过去几年中将Access和SQL Server应用程序移植到其他数据库平台已经造成了很多费用.引用所有内容的Oracle工具也是如此.未经训练的开发人员将DDL视为示例,然后在手动编写时继续使用相同的样式.在工具改进并且我们要求更好之前,这是一个艰难的循环.在Oracle中,引用与混合大小写相结合会导致区分大小写的数据库.我看过人们引用数据库中每个标识符的项目,我感觉我在The Land of The Lost中,开发人员在岛上进化而没有文档或最佳实践文章.

如果您从一开始就使用规范化的合法标识符编写DDL(使用OrderId或order_Id而不是[Order Id],您不必担心可能需要转义字符的神秘关键字;数据库会在您通知时通知您以前用过保留字.我可以用一根手指算时间,我们曾经从SQL Server的一个版本升级的应用程序到另一个有任何破损,由于新的保留字.

这通常是激烈争论的主题,所以如果你以另一种方式思考它:

C#程序员不会使用@转义所有变量,即使这样做是合法的.这将被视为一种奇怪的做法,并将成为StackOverflow上的嘲笑主题.逃逸应该是针对边缘情况.但是,写标准的C#标识符同一开发商不介意在逃避自己的SQL每一个标识符,书写非常难看,不可移植的SQL"代码".作为一名顾问,我遇到了不止一个SQL Server程序员,他们诚实地认为[]是必需的语法.我不怪开发者,我责怪工具.

  • Upvote用于讨论标准和系统之间的可移植性 (5认同)
  • 也是我的赞成.说实话,我认为微软坚持使用Square Brackets来惹恼其他人或让迁移变得更加困难. (4认同)
  • 避免SQL中不良做法的一个很好的相关示例 - "C#程序员不会使用@来逃避所有变量,即使这样做是合法的". (2认同)
  • 我很高兴读到这篇文章!我是 SQL 开发新手,我绝对属于“诚实地认为 [] 是必需语法的 SQL Server 程序员”的类别。谢谢你让我直截了当。 (2认同)

Dam*_*ver 6

这取决于您'有效的设置是否有效.你错过了".请参阅分隔标识符:

当QUOTED_IDENTIFIER设置为ON时,SQL Server遵循ISO规则,在SQL语句中使用双引号(")和单引号(').例如:

  • 双引号只能用于分隔标识符.它们不能用于分隔字符串.

  • 必须使用单引号括起字符串.它们不能用于分隔标识符.


当QUOTED_IDENTIFIER设置为OFF时,SQL Server对单引号和双引号使用以下规则:

  • 引号不能用于分隔标识符.相反,括号必须用作分隔符.

  • 单引号或双引号可用于包含字符串.

最后:

无论QUOTED_IDENTIFIER的设置如何,始终可以使用括号中的分隔符

在所有上述引用中,当他们提到括号时,他们谈的是[]括号.

  • 这不会影响“select 1 as 'foo'”的解释方式。 (2认同)

Mik*_*ser 5

单引号更具可读性。如上所示,以红色突出显示。

MySQL 使用“反引号”来转义特殊字符。

MSSQL 可以使用“双引号”或 [括号] 表示标识符(表、列等),
使用“单引号”表示字符串或别名。

方括号主要用于封装对象,以便空格、句点或连字符等特殊字符不会引发语法错误。

我建议在列别名之前使用“as”关键字 - 它更具可读性。

select [column with spaces] as 'my col' from "table with spaces" where n = 'foo'
select "column with spaces" as 'my col' from [table with spaces] where n = 'foo'
Run Code Online (Sandbox Code Playgroud)

  • Mike - 单引号不应在任何 DBMS 上用于列别名,因为单引号标识符可能会被内置函数误解为字符文字。要了解原因,请尝试以下代码:`select sum ('foo') from (select 1 as 'foo') x` (2认同)