目前场景是有一个兴趣爱好类型表和一个员工爱好表,员工爱好表中的爱好一列,如果这个员工有多个爱好,那么就将这些爱好放到一条记录当中,爱好之间用逗号隔开,现在需求是要将每个员工的这些爱好分隔成一条条记录查询出来,从而可以例如做员工爱好统计等应用。
爱好类型表 t_a
员工爱好表 t_b
需要的结果是
创建一个分隔字符串的表值函数
create function [dbo].[splitIDs]( @Ids nvarchar(1000), @split_char nvarchar(10) ) returns @t_id TABLE (id bigint) as begin declare @i int,@j int,@l int,@v bigint; set @i = 0; set @j = 0; set @l = len(@Ids); while(@j < @l) begin set @j = charindex(@split_char,@Ids,@i+1); if(@j = 0) set @j = @l+1; set @v = cast(SUBSTRING(@Ids,@i+1,@j-@i-1) as bigint); INSERT INTO @t_id VALUES(@v) set @i = @j; end return; end GO
采用下面的语句即可得到期望的结果
select aid = t_a.id ,aname = t_a.name ,bid = t_b.id,t_b.name from t_b cross apply splitIDs(a_ids,‘,‘) tbl_Ids INNER JOIN t_a ON tbl_Ids .id = t_a.id