加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

行使未确定命量的参数时,怎样停止动态SQL?

发布时间:2021-01-18 19:30:19 所属栏目:编程 来源:网络整理
导读:我有一个相同StackOverflow的标志体系,用于我正在处理赏罚的数据库.我正在编写一个存储进程,按照WHERE子句中未确定命量的标志查找功效.可以有0到10个标签之间的任何位置来过滤功效.譬喻,用户也许正在搜刮标志为“apple”,“orange”和“banana”的项目,而且每个结

我有一个相同StackOverflow的标志体系,用于我正在处理赏罚的数据库.我正在编写一个存储进程,按照WHERE子句中未确定命量的标志查找功效.可以有0到10个标签之间的任何位置来过滤功效.譬喻,用户也许正在搜刮标志为“apple”,“orange”和“banana”的项目,而且每个功效必需包括全部3个标志.我的查询变得越发伟大,由于我还在处理赏罚标志的交错引用表,但出于这个题目的目标,我不会进入谁人.

我知道我可以做一些字符串操纵并向exec()函数提供一个查询来处理赏罚这个题目,但我甘愿不办理与动态SQL相干的机能题目.我以为最好是SQL缓存存储进程的查询打算.

在这种环境下,您行使了哪些技能来停止动态SQL?

按照公共需求,这是我正在行使的查询:

SELECT ft.[RANK],s.shader_id,s.page_name,s.name,s.description,s.download_count,s.rating,s.price FROM shader s 
INNER JOIN FREETEXTTABLE(shader,*,@search_term) AS ft ON s.shader_id = ft.[KEY]
WHERE EXISTS(SELECT tsx.shader_id FROM tag_shader_xref tsx INNER JOIN tag t ON tsx.tag_id = t.tag_id WHERE tsx.shader_id = s.shader_id AND t.tag_name = 'color')
AND EXISTS(SELECT tsx.shader_id FROM tag_shader_xref tsx INNER JOIN tag t ON tsx.tag_id = t.tag_id WHERE tsx.shader_id = s.shader_id AND t.tag_name = 'saturation')
ORDER BY ft.[RANK] DESC

这是成果性但硬编码.你会看到我配置它来探求’颜色’和’饱和度’标签.

办理要领

有关此题目以及相同题目的具体概述,请参阅: http://www.sommarskog.se/dyn-search-2005.html

详细到你的题目是这里的部??分:http://www.sommarskog.se/dyn-search-2005.html#AND_ISNOTNULL

还要思量到(直接)动态办理方案不必然比(也许是伟大的)静态办理方案慢,由于查询打算如故可以缓存:请参阅http://www.sommarskog.se/dyn-search-2005.html#dynsql

因此,您必需按照现实数据量细心测试/权衡您的选项,同时思量现实查询(譬喻,行使一个或两个参数举办搜刮也许比行使十个搜刮更常见,等等)

编辑:提问者给出了一个很好的来由在评述中对此举办优化,从而将“过早”告诫移开:

然而,(尺度;)告诫词合用:这很像过早优化! – 你确定这个sproc会被挪用,凡是环境下行使动态SQL会明明变慢(也就是说,与应用措施中正在举办的其他工作对比)?

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读