【发布时间】:2017-06-28 17:57:05
【问题描述】:
我有几个使用动态 SQL 的存储过程。 我真的很想改变它们,使它们不是动态的,纯粹是因为由于错误处理(单击错误消息不会将您带到错误),它们可能会非常烦人的故障排除和更改。我知道我可以选择文本并将其粘贴为常规 SQL 来帮助解决这个问题,但这很令人沮丧。
我遇到的问题是查询在非动态时运行速度要慢得多。具体来说,由于增加了灵活性,where 子句在动态查询中的速度要快得多。例如,静态 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 正确地引导我找到错误吗?
【问题讨论】:
-
你是用
try/catch来获取动态SQL导致的错误吗?也许修复错误处理将满足您的需求。除非您使用recompile选项,否则即使是多个ifs 也可能会出现问题。 -
这将非常有帮助,令人沮丧的错误处理几乎是我想要更改动态查询的唯一原因。我只是在包含 SQL 的变量中使用 try/catch,还是需要在它之外编写?我不完全确定如何使用动态 SQL。
-
您可以制作专门的、优化的程序,然后根据您的参数调用适当的程序,这样您就可以避免 OR 条件。但是,您将有更多的程序需要维护。以我的经验,你永远不会得到一个“一刀切”的查询(或-或-或-或在 where 中的模式)与动态或专门的查询一样起作用。
标签: sql sql-server tsql sql-server-2012 dynamic-sql