用于改进代码质量的 SQL 代码分析

适用于:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceMicrosoft Fabric 中的 SQL 数据库

可以通过分析数据库代码来消除潜在的设计和命名问题并避免性能缺陷。 这些概念类似于执行静态分析来检测和更正托管代码中的缺陷。 配置要应用于数据库代码的分析规则、分析代码,然后更正或忽略发现的问题。 必须先将数据库架构导入数据库项目,然后才能分析数据库代码。 有关详细信息,请参阅从现有数据库开始

通过使用 provided 规则执行静态分析,可以识别属于以下Transact-SQL(T-SQL)类别的问题:

  • T-SQL 设计问题:设计问题包括可能无法按预期方式运行的代码、弃用的语法,以及在数据库设计发生更改时可能导致问题的问题。

  • T-SQL 命名问题:如果数据库对象的名称可能导致意外问题或违反通常接受的约定,则会出现命名问题。

  • T-SQL 性能问题:性能问题包括可能会显著降低数据库操作速度的代码。 这些问题中的许多识别出在代码运行时导致表扫描的代码。

    SQL Server Data Tools项目设置中代码分析规则的截图。

代码分析规则是可扩展的。 可以创建自己的规则来强制实施自己的编码标准。 有关详细信息,请参阅代码分析规则可扩展性概述

SQL 项目文件示例和语法

SQL 项目文件可以包含两个属性:RunSqlCodeAnalysisSqlCodeAnalysisRules。 该 RunSqlCodeAnalysis 元素指定在生成项目时是否运行代码分析。 默认情况下,构建会运行所有包含的规则,规则模式的检测会导致构建警告。

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build">
  <Sdk Name="Microsoft.Build.Sql" Version="1.0.0" />
  <PropertyGroup>
    <Name>AdventureWorks</Name>
    <DSP>Microsoft.Data.Tools.Schema.Sql.Sql160DatabaseSchemaProvider</DSP>
    <ModelCollation>1033, CI</ModelCollation>
    <RunSqlCodeAnalysis>True</RunSqlCodeAnalysis>
  </PropertyGroup>
...

SqlCodeAnalysisRules 元素指定规则及其错误或警告行为。 在以下示例中,禁用规则 Microsoft.Rules.Data.SR0006Microsoft.Rules.Data.SR0007,并且规则Microsoft.Rules.Data.SR0008的检测会导致生成错误。

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build">
  <Sdk Name="Microsoft.Build.Sql" Version="1.0.0" />
  <PropertyGroup>
    <Name>AdventureWorks</Name>
    <DSP>Microsoft.Data.Tools.Schema.Sql.Sql160DatabaseSchemaProvider</DSP>
    <ModelCollation>1033, CI</ModelCollation>
    <RunSqlCodeAnalysis>True</RunSqlCodeAnalysis>
    <SqlCodeAnalysisRules>-Microsoft.Rules.Data.SR0006;-Microsoft.Rules.Data.SR0007;+!Microsoft.Rules.Data.SR0008</SqlCodeAnalysisRules>
  </PropertyGroup>
...

可以将文件添加到 StaticCodeAnalysis.SuppressMessages.xml 项目以禁止显示特定的代码分析结果。 以下示例抑制了文件 SR0001 中存储过程的警告 StoredProcedures/uspGetEmployeeManagers.sql

<?xml version="1.0" encoding="utf-8" ?>
<StaticCodeAnalysis version="2" xmlns="urn:Microsoft.Data.Tools.Schema.StaticCodeAnalysis">
  <SuppressedFile FilePath="StoredProcedures/uspGetEmployeeManagers.sql">
    <SuppressedRule Category="Microsoft.Rules.Data" RuleId="SR0001" />
  </SuppressedFile>
</StaticCodeAnalysis>

提供的规则

T-SQL 设计问题

在数据库项目中分析 T-SQL 代码时,可能会看到一个或多个被归类为设计问题的警告。 解决这些问题以避免以下情况:

  • 后续对数据库做出更改可能会中断依赖于它的应用程序。
  • 代码可能不会产生预期的结果。
  • 如果在将来的 SQL Server 版本中运行代码,代码将中断。

通常,不要压制设计问题,因为它可能会导致应用程序中断,无论是现在还是未来。

提供的规则可识别以下设计问题:

T-SQL 命名问题

在数据库项目中分析 T-SQL 代码时,你可能会看到一个或多个警告分类为命名问题。 解决这些问题以避免以下情况:

  • 为对象指定的名称与系统对象的名称冲突。
  • 必须始终将指定名称括在转义字符中(例如,SQL Server、[])。
  • 你指定的名称会使尝试阅读和理解代码的其他人感到困惑。
  • 如果在将来的 SQL Server 版本中运行代码,代码将中断。

一般情况下,如果其他无法更改的应用程序依赖于当前名称,则禁止显示命名问题。

提供的规则可识别以下设计问题:

T-SQL 性能问题

分析数据库项目中的 T-SQL 代码时,可能会看到一个或多个警告分类为性能问题。 解决性能问题,避免出现以下情况:

  • 运行代码时,会发生表扫描。

通常,如果表中的数据量很少,以至于扫描不会显著影响性能,那么性能问题可以被抑制。

提供的规则可识别以下设计问题:

启用和禁用代码分析

若要在 SQL 数据库项目扩展中启用或禁用 SQL 代码分析,请直接编辑 .sqlproj 文件或使用代码分析设置对话框。

在 Visual Studio Code 中使用“代码分析设置”对话框

SQL 数据库项目扩展提供了一个设置对话框,用于配置代码分析规则,而无需直接编辑 .sqlproj 文件。

若要打开“Code Analysis设置”对话框,请在 Database Projects 视图中右键单击项目,然后选择“Code Analysis设置

 Visual Studio Code中“代码分析设置”对话框的截屏,显示了按类别分组的规则列表。

在对话框中,可以:

  • 使用对话框顶部的 在生成时启用代码分析 开关来启用或禁用代码分析。
  • 通过选中或取消选择类别名称旁的复选框(设计、命名、性能)来启用或禁用规则类别
  • 通过从规则旁边的下拉列表中选择严重性级别来更改规则的严重性。 可用选项为 “警告”、“ 错误”和 “无”。
  • 使用规则列表顶部的搜索栏搜索规则
  • 使用“所有严重性”下拉列表按严重性筛选规则

选择“确定”按钮以保存更改并关闭对话框,或选择“应用”按钮以保存而不关闭。 选择 “重置 ”以还原为默认设置。

编辑 SQL 项目文件以修改代码分析设置

在文本编辑器中,将 <RunSqlCodeAnalysis>True</RunSqlCodeAnalysis> 元素添加到第一个 <PropertyGroup> 块以启用代码分析。 若要禁用代码分析,请将元素RunSqlCodeAnalysis的值False更改为或完全删除元素。

若要在 SQL Server Management Studio (SSMS) 中启用或禁用 SQL 代码分析,请右键单击 Solution Explorer 中的项目,然后选择 Properties。 在属性窗口的代码分析选项卡中,选择所需的代码分析设置。

若要禁用特定规则或更改规则的严重性,请从规则列表中的该规则的下拉列表中选择相应的选项。

若要在Visual Studio中启用或禁用 SQL 代码分析,请右键单击 Solution Explorer 中的项目,然后选择 Properties。 在属性窗口的代码分析选项卡中,选择所需的代码分析设置。

若要禁用特定规则或更改规则的严重性,请从规则列表中的该规则的下拉列表中选择相应的选项。

若要在Visual Studio中启用或禁用 SQL 代码分析,请右键单击 Solution Explorer 中的项目,然后选择 Properties。 在属性窗口的代码分析选项卡中,选择所需的代码分析设置。

若要禁用特定规则或更改规则的严重性,请从规则列表中的该规则的下拉列表中选择相应的选项。

若要重写项目文件中的代码分析设置,请使用 /p:RunSqlCodeAnalysis 命令和 /p:SqlCodeAnalysisRules 属性 dotnet build 。 例如,若要在禁用代码分析的情况下进行生成,请执行以下操作:

dotnet build /p:RunSqlCodeAnalysis=False

若要使用特定的 SQL 代码分析规则设置进行生成,请执行以下操作:

dotnet build /p:RunSqlCodeAnalysis=True /p:SqlCodeAnalysisRules="+!Microsoft.Rules.Data.SR0001;+!Microsoft.Rules.Data.SR0008"