思路哪种好:我是用动态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.   

    你的数据库是MYSQL还是SQL SERVER?
      

  2.   

    我举的代码是 ms sqlserver 2000的,但是我问的是思路,谢谢。
      

  3.   

    这里是MYSQL,MS SQL SERVER另有专门的讨论版块。如果从MYSQL的观点来说。仅对这个例子,直接用SQL语句,根本不需要动态语句或者临时表。
    直接使用 
    select * from  gz where 部门=@strbumen  or @strbumen ='*'
      

  4.   

    问下斑竹,如果是多表关联查询的呢??
    比如select id,name from a inner join b on a.id=b.id where 1=1 and a.id=100;
    此时没有查询B的条件,上面的语句=select id,name from a where 1=1 and a.id=100;省掉了inner join b如果是select id,name from a inner join b on a.id=b.id where 1=1 and a.id=100 and b=100;
    如果有B的条件,就必须有INNER JOIN这时候有什么好办法吗?