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

时间:2013-10-29 11:33:44

标签: sql-server alias quotes brackets aliasing

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

select orderID 'Order No' from orders

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

select orderID [Order No] from orders

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

5 个答案:

答案 0 :(得分:57)

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

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

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

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

select OrderId as "Order Id" from Orders

写一个非便携式的:

select OrderId as [Order Id] from Orders

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

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

如果您从头开始使用规范化的合法标识符(使用OrderId或order_Id而不是[Order Id])编写DDL,则不必担心可能需要转义字符的神秘关键字;数据库将通知当你使用了一个保留字时,我可以指望我们曾经将应用程序从一个版本的SQL Server升级到另一个版本,并因保留字而导致任何破坏。

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

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

答案 1 :(得分:6)

这取决于您有效的设置'是否有效。你错过了"。见Delimited Identifiers

  

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

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

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

  •   

  

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

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

  •   
  • 单引号或双引号可用于括起字符串。

  •   

最后:

  

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

在上述所有引号中,当他们引用括号时,他们正在谈论[]括号。

答案 2 :(得分:4)

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

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'

答案 3 :(得分:1)

引用方法可以让您这样做:

SELECT 1 AS 'bla[]bla'

答案 4 :(得分:0)

感谢 Justin Grant 在此主题的评论中 - 发布此内容是为了提高知名度。

如果我们接受一般偏好是主观的,但希望保持一致,那么就实际差异而言,有充分的理由不使用单引号 '。如果您需要使用例如名称需要引用的列上的聚合函数,单引号会给您带来麻烦(直接从 Justin 的评论中复制/粘贴代码):

select sum ('foo') from (select 1 as 'foo') x

在我看来,这就是不使用单引号的充分理由 - 有些情况下您不能使用它们,这会妨碍一致性。

双引号 " 或括号 [] 是唯一的方法。这归结为您更看重哪种一致性 - 与 SQL Server 特定工具可能生成的代码的一致性,将使用括号,或遵守 ANSI 标准,该标准指定双引号。在根深蒂固的 Microsoft 环境中,括号可能更有意义。如果没有,双引号可能是更好的做法。