SQL Prompt使用教程:避免使用非标准的列别名(ST002和DEP021)
SQL Prompt是一款实用的SQL语法提示工具。SQL Prompt根据数据库的对象名称、语法和代码片段自动进行检索,为用户提供合适的代码选择。自动脚本设置使代码简单易读--当开发者不大熟悉脚本时尤其有用。SQL Prompt安装即可使用,能大幅提高编码效率。此外,用户还可根据需要进行自定义,使之以预想的方式工作。
如果使用equals SQL提示符声明列别名,将会违反样式规则(ST002)。最好遵循ANSI-SQL92标准,使用AS关键字分配别名。如果别名不是标准标识符,则用双引号分隔它。使用单引号一直以来都不被提倡(DEP021)。
曾经有一段时间,SQL Server和Sybase中的列别名只是通过赋值表达式来声明的,而有些人仍然喜欢用旧的方法来声明,就像我们中的一些人仍然喜欢跳线舞,或者穿紧身衣唱歌。如今,其他关系数据库系统,如PostgreSQL、MySQL、SQLite和Oracle,都使用as语法作为别名,就像ANSI-SQL92标准中定义的那样,该标准用于为结果的列分配名称。
无论古老的语法对您有多方便,通常最好还是坚持这种官方语法。首先,很可能将来有人将不得不维护您的代码,并且可能会因为没有学习过这些代码而对这些非标准的语法感到不解。其次,微软可以很容易地决定在SQL Server中支持旧的Sybase语法不再方便,您的代码也不会传输到新版本。
列别名侵犯
看在以前的份上,有很多SQL Server可以容忍的方法。下面的一些示例使用旧样式,即使用equals声明列别名,这会导致SQL Prompt引发与样式规则(ST002)的冲突,而其他示例则使用字符串文本(“Tables”)作为列别名,这早就被弃用了,因此违反了SQL Prompt不推荐使用的语法规则之一(DEP021)。
SELECT Tables = Schema_Name(schema_id)+'.'+[name] FROM sys.tables SELECT "Tables" = Schema_Name(schema_id)+'.'+[name] FROM sys.tables SELECT [Tables] = Schema_Name(schema_id)+'.'+[name] FROM sys.tables SELECT 'Tables' = Schema_Name(schema_id)+'.'+[name] FROM sys.tables SELECT Schema_Name(schema_id)+'.'+[name] [Tables] FROM sys.tables SELECT Schema_Name(schema_id)+'.'+[name] 'Tables' FROM sys.tables SELECT Schema_Name(schema_id)+'.'+[name] "Tables" FROM sys.tables SELECT Schema_Name(schema_id)+'.'+[name] Tables FROM sys.tables SELECT Schema_Name(schema_id)+'.'+[name] AS [Tables] FROM sys.tables SELECT Schema_Name(schema_id)+'.'+[name] AS 'Tables' FROM sys.tables SELECT Schema_Name(schema_id)+'.'+[name] AS "Tables" FROM sys.tables SELECT Schema_Name(schema_id)+'.'+[name] AS Tables FROM sys.tables
所有这些都给出了相同的结果。
别名的正确方法
但是,在这12种变体中,只有两种选择语句遵循官方的ANSI语法,即使用AS关键字,并在必要时将标识符放在双引号中。在SQL Server 2016中,' string_alias ' = expression的使用被标记为不推荐使用,但这确实适用于任何单引号的使用。
我认为最安全的方法是使用ANSI语法。如果文字不符合SQL Server标识符的规则,或者是保留字,那么它应该使用双引号,而不是单引号字符串分隔符。SQL Server首选的方括号分隔别名的用法来自Sybase。
我意识到AS关键字是可选的,但是使用可选的ANSI关键字是一个好习惯,如果它能使代码更易于阅读和理解,尽管可能会过度使用。我们所有人都不喜欢使用 NATIONAL CHARACTER VARYING( n ),而不是NVARCHAR(n)。
所以,我认为最好的形式是……
SELECT Schema_Name(schema_id)+'.'+[name] AS Tables FROM sys.tables
…或…
SELECT Schema_Name(schema_id)+'.'+[name] AS "My Tables" FROM sys.tables
除非您特别喜欢使用老式的赋值语法,否则应该避免使用它,因为它不是标准的SQL,而且只能容纳为以前版本的SQL Server编写的遗留代码。