gpt4 book ai didi

sql - 替代动态 SQL

转载 作者:行者123 更新时间:2023-12-04 02:07:24 25 4
gpt4 key购买 nike

我有几个使用动态 SQL 的存储过程。我真的很想改变它们,使它们不是动态的,纯粹是因为由于错误处理(单击错误消息不会将您带到错误),它们的故障排除和更改可能非常烦人。我知道我可以选择文本并将其粘贴为常规 SQL 来帮助解决这个问题,但这非常令人沮丧。

我遇到的问题是查询在非动态时运行得更慢。具体来说,where 子句在动态查询中的速度要快得多,因为它增加了灵 active 。例如,静态 where 子句类似于:

where
SomeColumn = case when @variable1 = 0 then SomeColumn else @variable1 end
and(
(@variable2 = -2 and SomeColumn2 = 1)
or (@variable2 = -1)
or (@variable2 = 0 and SomeColumn2 = 0 and SomeColumn3 = 0)
or (@variable2 = 1 and SomeColumn2 = 0 and SomeColumn3 > 0)
)

但是动态的 where 子句是:

where ' + @SomeCondition + @SomeCondition2 + '

使用这样的 case 语句:

declare @SomeCondition nvarchar(max) = case 
when @variable3 = -2 then N'Condition 1'
when @variable3 = 0 then N'Condition 2'
when @variable3 = 1 then N'Condition 3'
else N''
end

我能想到的唯一解决方案是使用多个 if 语句并且只更改每个语句中的 where 子句,但这似乎非常浪费和耗时。

除了动态 SQL,还有其他替代方案吗?如果做不到这一点,我能做些什么来让 sql-server 正确地引导我找到错误吗?

最佳答案

OPTION (RECOMPILE) 添加到查询中。这将导致它在每次执行时都被重新编译,并且优化器足够聪明,可以简化和消除谓词,就像您现在正在使用动态 SQL 自己做一样。

关于sql - 替代动态 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42158474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com