在数据库项目中基于每个文件抑制 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 警告的主要内容,如果未能解决你的问题,请参考以下文章