创建列别名时强制使用“as”?

u23*_*534 5 sql-server-2008 sql-server

我们发现很多bug都是因为缺少逗号,

select 
    aaaa,
    bbbb  -- forgot comma
    ccc,
    dddddddd,
.....
Run Code Online (Sandbox Code Playgroud)

它是一种使expression name无效的方法并且它必须expression as name在SQL语句中吗?(不是全局的,因为缺少“as”存在的遗留代码)

Aar*_*and 9

不,没有办法强制使用这种语法,除非你通过一些解析 SQL 代码并支持查找这样的语法的 3rd 方工具传递所有查询,但我认为甚至编写一些可以做的事情将是非常困难的这个。

也不可能阻止某人输入FROM dbo.table nolock并且没有意识到在这种情况下nolock是别名,而不是锁定提示。这就是为什么这有效:

SELECT name FROM sys.objects nolock WITH (NOLOCK);
Run Code Online (Sandbox Code Playgroud)

此外,我发现expression AS alias语法远不如alias = expression- 因为,当我审查或排除代码故障时,我更有可能需要在一行的开头通过其别名来查找列,而不是通过阅读可能的内容是一个非常长且复杂的表达式,它跨越线条或向右离开屏幕,并在与所有其他线条不同的垂直点处结束。并且由于别名应该比表达式短,所以我将别名放在首位对我来说更有意义。

然而,归根结底,这是一种偏好,不,没有办法强迫它。不要让您的开发人员将他们的草率归咎于语言。这是应该在第二组眼睛看到该查询之前捕捉到的东西。我的意思是,计算您的查询返回了多少列有多难?

  • 无论如何,Aaron 说服我使用 `alias = expression` 方法。我几个月前就开始了,一直没有回头。代码更具可读性、更流畅,以及 Aaron 提到的其他原因。我推荐它。并对这个答案+1。 (2认同)

And*_*y M 8

作为一种可能的解决方法,如果您的公司规定始终使用表别名作为列名的前缀,那么像您这样的查询将永远不会编译:

SELECT
  t.aaaa,
  t.bbbb   -- the missing comma results in "Incorrect syntax near '.'"
  t.ccc,
  t.dddddddd
  ...
FROM tablename AS t
  ...
Run Code Online (Sandbox Code Playgroud)

这样,无论是谁编写或正在审查查询都会很快发现问题。

当然,我们都是人,我们也很容易忘记遵守规则。尽管如此,该方法可能会导致此类问题较少。

  • +1 聪明,但仍然依赖于人类始终如一地为所有列添加前缀。您也可以告诉他们始终在每行末尾放置一个逗号。:-) (2认同)