思路哪种好:我是用动态sql呢?还是汇总全部数据,然后删除不要的记录?
------------------------------------
举个最简单的示例,只是例子,不是实际情况,但是可以说明问题,
假如我按部门统计员工的工资,写成一个存贮过程,
存贮过程中有一个“部门”的参数,用于传入部门编号,当部门编号为 “”时,查询全部部门的数据,但是如果不为“”
时,则查询相应部门的工资记录。
我可以有两种思路,
1.根据部门参数,构造一个动态sql语句,形如:
declare @str varchar(1000)
if @strbumen=''
begin
    set @strbumen='select * from gz'
end
else
beign
    set @Strbumen='select * from gz where 部门=‘’' + @strbumen + ''''
end
exec (@str)
2.
不用动态sql,而是汇总全部数据,然后根据参数删除临时表,形如:
select *
into #tmp
from gzif @strbumen<>''
begin
    delete #tmp where 部门<>@strbumen
end这种方法,可以避免拼接动态语句了,我认为实现起来简单,但是不足之处是,生成的没用的数据,然后要删除。
但是第一种方法,虽然不会生成用不到的数据,但是由于动态sql的效率太低,而且拼接语句也很复杂,所以也不太好。所以请大家分析一下,两种方法哪种好呢?

解决方案 »

  1.   

    这样不行吗create proc p_test @strbumen varchar(1000)
    as
    begin
    select * from gz where isnull(@strbumen,'')='' or 部门=@strbumen
    end
      

  2.   

    具体效率差不差,要实际测试才知道。动态sql的效率也不一定差,关键是看你的sql怎么写,以及怎么优化。
    我的建议是,两种结合起来。先select到临时表,然后在临时表基础上做sql拼接查询,当然,如果数据量大,可以在临时表上做索引。如果你要查询次数最少,直接拼接sql,当然,复杂度会提高一点。
      

  3.   


    谢谢,其实实际情况会复杂些,有可能是多个参数,如果3-4个参数的组合情况。
    您的办法就不太好使了。
    而且如果3-4个参数,拼接sql也非常复杂,修改也难。
    但是如何先将所有数据select 到临时表中,也处理(多数是删除操作),我认为反而简单些,
    我不知我的看法对不对?
      

  4.   


    先用必填条件最数据做第一次的统计,存入临时表。
    然后用ISNULL()函数对非必填条件做判断,组装动态SQL语句,然后用EXEC(@sSql)来执行。
    这样既方便调试,又方便代码编写。效率方面,也有优化和提升的空间。
      

  5.   

    先用必填条件最数据做第一次的统计,存入临时表。
    然后用ISNULL()函数对非必填条件做判断,组装动态SQL语句,然后用EXEC(@sSql)来执行。
    这样既方便调试,又方便代码编写。效率方面,也有优化和提升的空间。
    -------------------------------------
    已经存入临时表了,此时根据条件删除记录就行了,
    应该就没有必要再组装动态 sql语句了,我组装动态sql的目的就是,不生成中间临时表呀。(即一次性生成最终结果的临时表),如果先生成一个中间临时表,根本不再用到动态sql了,大家以为呢?