--测试
create table a(date datetime, onduty varchar(100))
create table b(date datetime, onduty varchar(100))
insert a select '2003-4-4', '12001;12004;12005;'
insert b select '2003-4-4', '李在;张中要;刘会同;'
--存储过程
create proc getexpname @date varchar(8)
as
declare @table table(expid int , name varchar(100))
declare @endpos int, @beginpos int
set @beginpos=1
select @endpos=charindex(';',onduty) from a
where convert(varchar(8),date,112)=@date
declare @endpos1 int, @beginpos1 int
set @beginpos1=1
select @endpos1=charindex(';',onduty) from b
where convert(varchar(8),date,112)=@datewhile @endpos<>0
begin
insert @table select substring(a.onduty,@beginpos,@endpos-@beginpos) as expid,
substring(b.onduty,@beginpos1,@endpos1-@beginpos1) as name
from a,b where convert(varchar(8),a.date,112)=@date
and a.date=b.date
select @beginpos=@endpos+1, @endpos=charindex(';',onduty,@endpos+1)
from a where convert(varchar(8),date,112)=@date
select @beginpos1=@endpos1+1, @endpos1=charindex(';',onduty,@endpos1+1)
from b where convert(varchar(8),date,112)=@date
end
select * from @table
--测试
exec getexpname '200340304'--结果
12001 李在
12004 张中要
12005 刘会同
create table a(date datetime, onduty varchar(100))
create table b(date datetime, onduty varchar(100))
insert a select '2003-4-4', '12001;12004;12005;'
insert b select '2003-4-4', '李在;张中要;刘会同;'
--存储过程
create proc getexpname @date varchar(8)
as
declare @table table(expid int , name varchar(100))
declare @endpos int, @beginpos int
set @beginpos=1
select @endpos=charindex(';',onduty) from a
where convert(varchar(8),date,112)=@date
declare @endpos1 int, @beginpos1 int
set @beginpos1=1
select @endpos1=charindex(';',onduty) from b
where convert(varchar(8),date,112)=@datewhile @endpos<>0
begin
insert @table select substring(a.onduty,@beginpos,@endpos-@beginpos) as expid,
substring(b.onduty,@beginpos1,@endpos1-@beginpos1) as name
from a,b where convert(varchar(8),a.date,112)=@date
and a.date=b.date
select @beginpos=@endpos+1, @endpos=charindex(';',onduty,@endpos+1)
from a where convert(varchar(8),date,112)=@date
select @beginpos1=@endpos1+1, @endpos1=charindex(';',onduty,@endpos1+1)
from b where convert(varchar(8),date,112)=@date
end
select * from @table
--测试
exec getexpname '200340304'--结果
12001 李在
12004 张中要
12005 刘会同
insert into #B (empid,name)values('10002','王芳')
insert into #B (empid,name)values('10003','张忠要')
select * from #B
insert into #A(date,onduty)values('2003-01-01','10001;10002;10003')
insert into #A(date,onduty)values('2003-01-02','10001;10002')select * from #A
select #a.date,#B.name from #a left join #b on #a.onduty like '%'+#b.empid+'%'下一步就是根据日期分组,把姓名相加了
create table ta(date datetime,onduty varchar(1000))
insert into ta values('2003-3-4','12001;12004;12005;')create table tb(EmpID varchar(5),Name varchar(10))
Insert into tb
select '12001','李在;'
union all select '12002','王芳;'
union all select '12004','張中要;'
union all select '12005','阿門;'
create function dbo.fn_a(@s varchar(1000))
returns varchar(1000)
as
begin
declare @a varchar(1000),@b varchar(1000)
declare @i int
set @a=''
set @i=1
while @i>0
begin
select @a=@a+name from tb where EmpID=substring(@s,@i,5)
set @i=charindex(';',@s,@i+6)-5
end
return(@a)
end
--刪除
drop function dbo.fn_a
drop table ta
drop table tb--結果
select convert(varchar(10),date,120),dbo.fn_a(onduty) as onduty from ta
date Onduty
------------------------------------------------------------------
2003-03-04 李在;張中要;阿門;
(※★山,快馬加鞭未下鞍...☆※) 的符合本人的要求.