行使未确定命量的参数时,怎样停止动态SQL?
我有一个相同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会明明变慢(也就是说,与应用措施中正在举办的其他工作对比)? (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |