思路哪种好:我是用动态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.根据部门参数,构造一个动态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的效率太低,而且拼接语句也很复杂,所以也不太好。所以请大家分析一下,两种方法哪种好呢?
直接使用
select * from gz where 部门=@strbumen or @strbumen ='*'
比如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这时候有什么好办法吗?