作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在处理一个带有几个可选参数的存储过程。其中一些参数是单个值,很容易使用 WHERE 子句,例如:
WHERE (@parameter IS NULL OR column = @parameter)
但是,在某些情况下,WHERE 条件更为复杂:
WHERE (@NewGroupId IS NULL OR si.SiteId IN (SELECT gs.SiteId
FROM [UtilityWeb].[dbo].[GroupSites] AS gs
WHERE gs.GroupId = @NewGroupId))
当我取消注释这些复杂的 WHERE 子句时,查询执行时间加倍,执行计划变得非常复杂。虽然执行计划并不困扰我,但将查询的执行时间加倍是一个明确的问题。
其他人是否找到了在其存储过程中使用可选参数的最佳实践或模式?
这是动态 SQL 是更好解决方案的实例之一吗?
最佳答案
我会为参数是否可用创建单独的查询。
这会创建更简单的 SQL,并且优化器会做得更好。
像这样:
if (@parameter IS NULL) then begin
select * from foo
end
else begin
select * from foo where value = @parameter
end
在你有很多参数要像这样重新设计,并且你寻求动态 sql 解决方案,然后也总是使用参数,你可能会被 SQL-Injection 咬住错误。
也可以组合。最有可能使用的查询/您完整编码的查询,并进行预编译。所有其他组合都是动态创建的。
关于sql - 使用可选的存储过程参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/229622/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!