数据库教程:使用SQL提示代码分析避免T-SQL技术债务
SQL Prompt是一款实用的SQL语法提示工具。SQL Prompt根据数据库的对象名称、语法和代码片段自动进行检索,为用户提供合适的代码选择。自动脚本设置使代码简单易读--当开发者不大熟悉脚本时尤其有用。SQL Prompt安装即可使用,能大幅提高编码效率。此外,用户还可根据需要进行自定义,使之以预想的方式工作。
SQL Prompt的代码分析功能可帮助您在键入时发现代码问题和代码开发过程中的隐患。它还提供了改进代码的技巧,并提供了指向文档的链接,这些文档提供了有关每个受支持规则的建议,因此您可以决定最佳的操作方案。安装或升级到SQL Prompt 9后,您将看到两个新菜单项:启用代码分析和管理代码分析规则。确保已选中“启用代码分析”。
![](https://www.red-gate.com/wp-content/uploads/2018/02/word-image.png)
当您打开现有查询或开始在新窗口中键入内容时,代码分析功能将开始发挥作用。它将在后台解析您的代码,并根据一组内置规则检查SQL语法。这些规则旨在捕获可能导致代码失败或执行不正确的即时问题,消除潜在的性能问题,突出显示不赞成或过时的语法并鼓励最佳编码实践。代码问题和改进建议在问题编辑器中以绿色波浪线显示在查询编辑器中。
如果单击“管理代码分析规则”,您将看到SQL Prompt当前支持的各种不同类型的规则。您还可以在其中控制要启用或禁用的规则。
![](https://www.red-gate.com/wp-content/uploads/2018/02/word-image-1.png)
当前,所有规则都是全局的,但是我希望后续版本允许更精细的控制。例如,开发人员可能希望针对每个服务器或数据库配置规则,就像您对其他“提示”功能(如“标签颜色”)所做的一样。他们可能还希望能够建立和在多组规则之间进行切换,这取决于他们当前正在从事的项目,其使用方式类似于在多种代码格式样式之间使用和交换。
打破规则…
通过打破一些规则,让我们看看SQL Prompt的代码分析功能的实际作用。这是我们的原始查询:
USE WideWorldImportersDW; GO SELECT TOP 10 City, SUM(Profit) FROM Dimension.City c, Fact.Sale WHERE [Latest Recorded Population] !=0 AND City.[City Key] = Sale.[City Key] GROUP BY City ORDER BY SUM(Profit) DESC;
在SSSM中打开脚本时,可以看到SQL Prompt突出显示了一些问题!哦,男孩,看看那些绿色的,弯曲的线条。不要在家尝试此查询!
![](https://www.red-gate.com/wp-content/uploads/2018/02/word-image-2.png)
让我们看看如何使用代码分析来改进代码。将鼠标悬停在上TOP 10,我们看到此代码使用旧式TOP子句:
当我们单击时TOP 10,代码将突出显示为绿色,并出现带有灯泡的蓝色图标。代码以绿色突出显示时,我们可以单击灯泡图标或按Ctrl以查看详细信息。
弹出“问题详细信息”窗口,告诉我们有关该问题的更多信息,我们可以转到在线文档以获取更多信息,也可以选择禁用该规则。
![](https://www.red-gate.com/wp-content/uploads/2018/02/word-image-5.png)
如果我们选择从“问题详细信息”窗口中禁用规则,则会显示一个红色的禁用图标,绿色的波浪线消失。
接下来,代码分析告诉我们,我们具有不合格的列名:
![](https://www.red-gate.com/wp-content/uploads/2018/02/word-image-7.png)
该问题的详细信息提供的建议:“列名应该是合格的,其表名,如果它是一个连接的一部分或者是子查询。即使当前是明确的,在某些时候也可能会做出更改,从而导致错误。”
为了解决这个问题,我们首先给表命名。然后,我们节省了一些时间,并使用SQL Prompt的内置“合格对象名称”(Ctrl + B,Ctrl + Q )功能,而不是手动限定对象名称。
我们正在进步!我们的查询只剩下两个问题。第一个问题是我们使用的是老式的连接语法。
与严格的规则相比,与其他类别相比,风格规则听起来更像是个人喜好。但是,破坏良好的样式惯例可能会带来比您想象的更多的麻烦,因为这通常会使您的代码更难于他人阅读和理解,并且有时还更容易引入错误。
尽管仍然支持旧式内部联接,但它们没有提供比ANSI标准JOIN语法更好的优势。此外,如果WHERE在更改其他子句时不小心删除或注释了该子句怎么办?查询仍将愉快地执行,但是您现在有了交叉联接,而不是预期的内部联接,这可能会导致错误的结果。
为了解决这个问题,我们重写查询以使用ANSI标准JOIN语法。使用显式联接而不是旧式联接的一个有益的副作用是,SQL Prompt可以ON为我们建议并插入该子句。
![](https://www.red-gate.com/wp-content/uploads/2018/02/word-image-9.png)
最后,代码分析告诉我们!=应该用<>运算符替换运算符。
现在,我们选择禁用某些规则,并更改查询以遵循其他规则和最佳样式惯例。最后一步可能是使用SQL Prompt的Format SQL(Ctrl + K,Ctrl + Y )功能来坚持格式样式。最终查询如下所示:
SELECT TOP 10 c.City, SUM(s.Profit) FROM Dimension.City c INNER JOIN Fact.Sale s ON s.[City Key] = c.[City Key] WHERE c.[Latest Recorded Population] <> 0 GROUP BY c.City ORDER BY SUM(s.Profit) DESC;
通过研究代码分析建议,我们现在已经知道(或被提醒)应该在TOP子句,合格的对象名称,显式联接和ANSI样式运算符中使用推荐的括号。
我的代码违反了一些规则,我该怎么办?
第一个开始是“代码分析”文档,您将在“问题详细信息”窗口中看到该文档。对于某些规则,记录下来的规则描述应该足以让您了解如何修复代码。
但是,对于其他规则,在决定采取正确的措施之前,您可能需要更多的指导并进行一些研究。Redgate正在构建为每个规则提供的信息,并且您可以期望看到开发的文章库,它们提供了有关如何处理这些问题的更实用建议。如果不确定,请遵循《Transact-SQL参考》中Microsoft的建议。
概要
SQL Prompt 9启动时包含60多个代码分析规则,这些规则检查代码中的最佳做法,不推荐使用的功能,对性能的影响,旧样式等。这只是该功能的第一个版本。随着它的发展,我个人希望能够对每个服务器和数据库启用/禁用规则,根据我正在从事的项目在规则集之间进行切换,并最终根据建议自动修复代码中的问题。
但是,SQL Prompt的代码分析功能已经帮助我确定了代码中的几个问题和潜在的改进,并提醒我也更改了某些SQL Prompt代码片段中的代码。我知道这是一个伟大的功能,它将帮助团队防止在其代码库中积累技术债务。
当然,永远不要单靠工具。工具可以为您提供帮助,但始终确保您了解工具为何提出某些建议。将该工具用作提醒,然后从中学习成为更好的SQL开发人员🙂