在数据库项目中基于每个文件抑制 SQL 警告

Posted

技术标签:

【中文标题】在数据库项目中基于每个文件抑制 SQL 警告【英文标题】:Supress SQL Warnings on a per File Basis in Database Project 【发布时间】:2017-02-28 19:26:46 【问题描述】:

我在 Visual Studio 解决方案中有两个 SQL Server 数据库项目。其中之一是一个遗留数据库,我只是在我的主数据库项目中使用数据库引用。我在我的主数据库项目中有一个类似于

的视图
SELECT *
FROM [$(ReferenceDb)].[dbo].[Table1] t
WHERE t.IndexedColumnId IN (1, 55, 99)

我来了

SR0004:Microsoft.Rules.Data:没有使用索引的列 作为 IN 谓词测试表达式可能会降低性能。

参考数据库在该列上有一个索引。请注意,这是用于演示目的的简化代码。我实际上将参考数据库中的表加入到我的主数据库中的表中。如果我将这个简单的代码移到参考数据库项目中,我不会收到任何警告。主数据库项目似乎没有使用参考数据库中的索引。

我想做的是抑制这个警告;但我不想为整个主数据库项目这样做。我只想对某些 SQL 视图/存储过程等禁用它。

我正在寻找类似于 C# 文件中可用的警告的源内抑制功能。

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "args")]

但我需要能够在主数据库项目的 .sql 文件中执行此操作。

我曾讨论过关闭整个项目的警告,但真的不想走那条路。

对这个问题有什么建议吗?

【问题讨论】:

【参考方案1】:

转到您的项目属性。您显然已打开代码分析。您仍将在整个项目中将其关闭,但您可以关闭该特定警告。

我认为不可能只针对一个文件关闭此特定警告,因为它是项目级分析。

【讨论】:

这正是我试图避免的。我知道如何为项目关闭它,但我希望它保持打开状态,但只是在特定位置忽略它。类似于他们通过使用“#pragma warning disable xxxx”功能或“System.Diagnostics.CodeAnalysis.SuppressMessage”元数据标签使用 C# 进行的文件内抑制。看起来这个问题在可能的更高版本之前可能没有有效的答案。 很确定不可能按文件关闭它。您可以禁止警告,但不能禁止规则检查。我知道这不是你想要的,但不知道有什么方法可以实现你现在想要的。 +1 表示尝试...但未接受。也许几年后随着新版本的发布,它们将成为一个解决方案。我基本上得出了同样的结论。我想到的唯一解决方法是在他们自己的项目中拥有这些“特殊”的跨数据库视图,我关闭了警告。然后将其作为附加参考添加回我的主数据库项目。在截止日期临近的情况下,目前似乎有些矫枉过正;(我将不得不忍受引入的技术债务。【参考方案2】:

理论上,在项目的<Build> 节点中,您可以拥有例如<SuppressTSqlWarnings>71562</SuppressTSqlWarnings> 但我还没有发现这个工作

【讨论】:

使用 VS 2019 社区版 16.9.5 版,您的建议如前所述【参考方案3】:

Visual Studio 2017 和 Visual Studio 2019 支持基于每个文件在 SSDT 中抑制 SQL Server 静态代码分析警告。

    在您的 SSDT 项目根目录中创建一个名为 StaticCodeAnalysis.SuppressMessages.xml 的新 XML 文件。

    确保它也被添加到 .sqlproj 文件中,构建操作为 None,而不是复制到输出目录。

    将此模板复制并粘贴到该文件中:

    <?xml version="1.0" encoding="utf-8"?>
    <StaticCodeAnalysis version="2" xmlns="urn:Microsoft.Data.Tools.Schema.StaticCodeAnalysis">
        <SuppressedFile FilePath="dbo\Stored Procedures\Procedure1.sql">
            <SuppressedRule Category="Microsoft.Rules.Data" RuleId="SR0007" />
            <SuppressedRule Category="Microsoft.Rules.Data" RuleId="SR0004" />
            <SuppressedRule Category="Microsoft.Rules.Data" RuleId="SR0005" />
            <SuppressedRule Category="Microsoft.Rules.Data" RuleId="SR0015" />
        </SuppressedFile>
        <SuppressedFile FilePath="dbo\Functions\Function1.sql">
            <SuppressedRule Category="Microsoft.Rules.Data" RuleId="SR0007" />
        </SuppressedFile>
    </StaticCodeAnalysis>
    

    重建您的数据库项目,这些规则现在将在这些文件中被隐藏。

警告:自从我更新到 Visual Studio 2019 16.7 以来,我一直遇到 SSDT 问题,当我在错误列表窗口 - 或者如果它有效,那么当我在上下文菜单中选择抑制选项时它肯定会冻结,所以我必须手动手动将抑制添加到这个文件中,呃。

【讨论】:

以上是关于在数据库项目中基于每个文件抑制 SQL 警告的主要内容,如果未能解决你的问题,请参考以下文章

抑制预期 Oracle 异常的 PHP 警告

代码生成器生成文件的代码分析 - 如何抑制警告?

在 Visual Studio 中抑制 tlbimp 警告

如何让 CMake 创建一个 xcode 项目,其中警告在系统标头中被抑制?

如何抑制更新链接警告?

如何从 Visual Studio 项目中获取抑制的代码分析警告列表?