目前情境是有一個興趣愛好類型表和一個員工愛好表,員工愛好表中的愛好一列,如果這個員工有多個愛好,那麼就將這些愛好放到一條記錄當中,愛好之間用逗號隔開,現在需求是要將每個員工的這些愛好分隔成一條條記錄查詢出來,從而可以例如做員工愛好統計等應用。
愛好類型表 t_a
員工愛好表 t_b
需要的結果是
建立一個分隔字串的資料表值函式
create function [dbo].[splitIDs]( @Ids nvarchar(1000), @split_char nvarchar(10))returns @t_id TABLE (id bigint)asbegin 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;endGO
採用下面的語句即可得到期望的結果
select aid = t_a.id ,aname = t_a.name ,bid = t_b.id,t_b.namefrom t_bcross apply splitIDs(a_ids,',') tbl_IdsINNER 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 ONGOSET QUOTED_IDENTIFIER ONGOALTER 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',',')