--有资料表t_zl
zldm,zlmc
01,MC1
02,MC2
.....
--数据表t_sj
zldm,zlmc,sj
01,MC1,10
03,MC3,20
求个存储过程例子,实现:
当执行存储过程时:EXEC SP_test_01 @ZLDM = N'全部'
存储过程实现
创建临时表,
create table #TEMPzl (zldm varchar(20))
将t_zl所有zldm插入临时表里
insert #TEMPzl (zldm)
select zldm from t_zl
再执行数据查询
select * from t_sj where zldm in (select zldm from #TEMPzl)
完成!
当执行存储过程时:EXEC SP_test_01 @ZLDM = N'01;03'
存储过程实现
创建临时表,
create table #TEMPzl (zldm varchar(20))
将01;03插入临时表#TEMPzl ,且数据如下:
zldm
01
03
在执行数据查询
select * from t_sj where zldm in (select zldm from #TEMPzl)
完成!
------解决方案--------------------
create table t_zl
(zldm varchar(10),zlmc varchar(10))
insert into t_zl
select '01','MC1' union all
select '02','MC2'
create table t_sj
(zldm varchar(10),zlmc varchar(10),sj int)
insert into t_sj
select '01','MC1',10 union all
select '03','MC3',20
-- 建存储过程
create proc SP_test_01
(@ZLDM nvarchar(50))
as
begin
create table #TEMPzl(zldm varchar(20))
if @ZLDM=N'全部'
insert #TEMPzl(zldm)
select zldm from t_zl
else
insert #TEMPzl(zldm)
select substring(a.s,b.number,charindex(';',a.s+';',b.number)-b.number)
from (select @ZLDM 's') a,master..spt_values b
where b.[type]='P' and b.number between 1 and len(a.s)
and substring(';'+a.s,b.number,1)=';'
select *
from t_sj
where zldm in(select zldm from #TEMPzl)
end
-- 测试1
exec SP_test_01 @ZLDM=N'全部'
/*
zldm zlmc sj
---------- ---------- -----------
01 MC1 10
(1 row(s) affected)
*/
-- 测试2
exec SP_test_01 @ZLDM=N'01;03'
/*
zldm zlmc sj
---------- ---------- -----------
01 MC1 10
03 MC3 20
(2 row(s) affected)
*/
------解决方案--------------------
是否全部,用if/else判断一下就可以了。拆分函数:
/*
功能说明:传入字符串跟分割符('''HE00000003'',''HE00000004'',''HE00000005'''),返回一个Table
*/
Create function [dbo].[fnSys_SplitString]
(
---字符串分割
@Str varchar(max), --传入的字符串
@SeprateStr varchar(10)--分隔符
)
Returns @temp table(Code varchar(100)) --返回一个Table
As
Begin
Declare @i int
Set @Str=REPLACE(@str,'''','')
Set @Str =rtrim(ltrim(@Str ))
Set @i=charindex(@SeprateStr,@Str )
While @i>=1
Begin
Insert @temp values(left(@Str ,@i-1))
Set @Str =substring(@Str ,@i+1,len(@Str )-@i)
Set @i=charindex(@SeprateStr,@Str )
End
If @Str <>''
Insert @temp values(@Str )
Return
End
select * from [dbo].[fnSys_SplitString]('''HE00000003'',''HE00000004'',''HE00000005''')
------解决方案--------------------