【问题标题】:Stored proc with 11+ dynamic parameters具有 11 个以上动态参数的存储过程
【发布时间】:2011-01-19 20:44:52
【问题描述】:

我知道以前有人问过这个问题并进行过辩论。我读过的答案大多是意见,所以我正在寻找更具技术性的东西。更多“幕后”。

我正在使用 SQL Server 2008。我即将编写一个需要接受至少 11 个输入的查询。用户可以指定其中的 1 到 11(+) 个。它们有多种类型(ID、文本匹配、地理、全文匹配、记录集等)。它与 SQL 一样动态。

我知道如何在不使用动态 SQL 的情况下做到这一点:

/*for simple match*/ WHERE @Input IS NOT NULL OR t.col = @Input

由于连接等原因,这有缺点。我从不使用动态 SQL。但从我读过的内容来看,这似乎是动态 SQL 的情况。

谁能给点技术指导?

【问题讨论】:

标签: sql sql-server windows-server-2008 dynamic-sql


【解决方案1】:

http://www.sommarskog.se/index.html

看看Dynamic SQl的祸福和Dynamic Search Conditions链接

【讨论】:

    【解决方案2】:

    您需要记住,如果您不想使用动态 SQL(我也不想使用),那么 DRY 原则就有点不合时宜了。

    有效利用 TVP 并接受这样一个事实,即您将具有较高的圈复杂度(对于 SQL 语句)

    如果您希望所有内容都可缓存和 sargable,您应该考虑如何在多个过程中设计它,然后根据需要分解您的条件。

    另一种非常常见的方法是包含以下条件:

    WHERE (@pParam IS NULL OR ~condition~)
    

    如果您的参数为 NULL,则 SQL 不会费心解决另一半条件。 编辑:最后一部分仅适用于 SQL2008R2,并且仅在使用 OPTION(RECOMPILE) 命令时才适用

    【讨论】:

    • 您的最后一行完全不正确。这种做法使潜在可搜索的搜索谓词变得不可搜索,并导致不必要的表扫描。
    • @Martin,我省略了有关使用 OPTION (RECOMPILE) 的重要部分,但实践直接来自发布的链接中的 Erland Sommarskog。
    • 这是一个非常重要的部分,可以省略!顺便说一句,它实际上是 SQL Server 2008 SP1 CU5 和更高版本,而不仅仅是 R2 这适用于。
    猜你喜欢
    • 2017-09-18
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 2018-09-28
    • 1970-01-01
    • 2023-03-31
    • 2016-07-29
    相关资源
    最近更新 更多