目前场景是有一个兴趣爱好类型表和一个员工爱好表,员工爱好表中的爱好一列,如果这个员工有多个爱好,那么就将这些爱好放到一条记录当中,爱好之间用逗号隔开,现在需求是要将每个员工的这些爱好分隔成一条条记录查询出来,从而可以例如做员工爱好统计等应用。
爱好类型表 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
分割字符串函数的另一种写法
USE [master]
GO
/****** Object: UserDefinedFunction [dbo].[Split] Script Date: 05/08/2014 14:45:25 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[Split]
(
@c VARCHAR(MAX) ,
@split VARCHAR(50)
)
RETURNS @t TABLE ( col VARCHAR(50) )
AS
BEGIN
WHILE ( CHARINDEX(@split, @c) <> 0 )
BEGIN
INSERT @t( col )
VALUES ( SUBSTRING(@c, 1, CHARINDEX(@split, @c) - 1) )
SET @c = STUFF(@c, 1, CHARINDEX(@split, @c), '')
END
INSERT @t( col ) VALUES ( @c )
RETURN
END
-------------------------------END OF FUNCTION----------------------------------------------
使用方法
select * from Split('1,2,3',',')