存储过程中动态查询问题,该怎样才效率最高?
比如有一个表T1,有三个字段:
[ID] bigint,
[F1] varchar(255),
[F2] varchar(255)
创建一个存储过程动态查询,传递三个参数:
create proc P_Select( @ID bigint,@F1 varchar(255),@F2 varchar(255))
as
begin
select *
from T1
where case when not @ID is null then
[id] =@ID
else
0=0
end
and when not @F1 is null then
F1 like '% ' + @F1 + '% '
else
0=0
end
and when not @F2 is null then
F2 like '% ' + @F2 + '% '
else
0=0
end
end
这样不行,有没有什么比较好的方法?
除了在存储过程里先生成SQL语句然后再用exec执行这种方法之外.
------解决方案--------------------create proc P_Select( @ID bigint,@F1 varchar(255),@F2 varchar(255))
as
begin
declare @sql nvarchar(4000)
set @sql= 'select * from T1 where '
if @ID is not null
begin
set @sql=@sql + ' ID= '+cONVERT(NVARCHAR(10),@ID)+ ' and '
end
if @F1 is not null
begin
set @sql=@sql + ' F1= ' ' '+@F1+ ' ' ' and '
end
if @F2 is not null
begin
set @sql=@sql + ' F2= ' ' '+@F2+ ' ' ' and '
end
set @sql=@sql+ ' 1=1 '
print @sql
EXEC(@sql)
end
GO
这样试一下 ,把where 写成动态的
------解决方案--------------------首先 已经尽量不要去使用动态的拼接查询字符串的方法
这样效率会很低(亲自测试过的).
如果遇到你这样的需要考虑的参数不是特别多,就考虑枚举把
这样可读性更强,程序更稳定,效率也最高
@ID bigint,@F1 varchar(255),@F2 varchar(255))
IF @ID IS NULL AND @F1 IS NULL AND @F2 IS NULL --000
-------
ELSE IF --001
ELSE IF --010
ELSE IF --011
ELSE IF --100
ELSE IF --101
....................
这样罗列下去 就OK了
------解决方案--------------------create proc proc_search
@deptname varchar(20),
@isstart char(6),
@isend char(6),
@percent int
as
select pid,pname,pe_id,pdept,pd_name,pstatus,pend,begintime,endtime,maxfee
from project_view
where (@deptname= '无限制 ' or pd_name=@deptname)
and (@isstart= '无限制 ' or pstatus=@isstart)
and (@isend= '无限制 ' or pend=@isend)
go
不知道楼主说的是不是多条件任意组合查询呢
------解决方案--------------------create proc tb_select @id int,@name varchar(10),@addr varchar(20)
as
begin
select * from tb where sid=(case when @id> 0 then @id else 0 end) and sname like @name + '% ' and saddr like @addr + '% '
end