/* 作者:htl258(Tony) 标题:字符拆分应用实例 内容: 表1 e_SongType ID text text2 text3 1 的士高 的士高 Disco 2 励志 励志 Encourage 3 舞曲 舞曲 Dance 4 流行 流行 POPmusic .... 表2 Song ID Song singer SongType 1 野人的士高 未知 1000000000000000000000000000000000000000 2 光阴的故事 罗大佑 0101000000000000000000000000000000000000 3 小酒窝 林俊杰 0001000000000000000000000000000000000000 4 我是小沈阳(DJ) 小沈阳 1001000000000000000000000000000000000000 .... 上面是表的部分内容,表2的SongType字节共40位,当第一位等于1时,表1对应ID就是1,依此类推,第几位等于1时,表1的ID就对应几,当出现两个1的时候,证明这首歌有两个类型,就像上面表2的 <光阴的故事>,它的SongType就是励志和流行, <小酒窝>它的SongType就是流行.... 想知道怎样查询这个1的位置对应的内容和个数,如下得到如下结果: BID Song singer SongType SongTypeCount ----------- ---------- ------ ---------------------- ------------------------ 1 野人的士高 未知 的士高 1 2 光阴的故事 罗大佑 励志,流行 2 3 小酒窝 林俊杰 流行 1 4 我是小沈阳(DJ) 小沈阳 的士高,流行 2 时间:2009-09-06 09:42 */ --1.创建测试表 If not object_id('[e_SongType]') is null Drop table [e_SongType] Go Create table [e_SongType]([ID] int,[text] nvarchar(3),[text2] nvarchar(3),[text3] nvarchar(9)) Insert [e_SongType] Select 1,N'的士高',N'的士高',N'Disco' union all Select 2,N'励志',N'励志',N'Encourage' union all Select 3,N'舞曲',N'舞曲',N'Dance' union all Select 4,N'流行',N'流行',N'POPmusic' Go If not object_id('[Song]') is null Drop table [Song] Go Create table [Song]([ID] int,[Song] nvarchar(9),[singer] nvarchar(3),[SongType] nvarchar(40)) Insert [Song] Select 1,N'野人的士高',N'未知',N'1000000000000000000000000000000000000000' union all Select 2,N'光阴的故事',N'罗大佑',N'0101000000000000000000000000000000000000' union all Select 3,N'小酒窝',N'林俊杰',N'0001000000000000000000000000000000000000' union all Select 4,N'我是小沈阳(DJ)',N'小沈阳',N'1001000000000000000000000000000000000000' Go --创建自定义函数 If object_id('dbo.fn_split')is not null Drop function dbo.fn_split Go Create function dbo.fn_split ( @str varchar(8000), --输入的字符串 @type bit --0 返回数量,1 返回位置值 ) returns varchar(1000) as begin declare @s varchar(1000) --用于存储返回的值 if @type=0 set @s=ltrim(len(@str)-len(replace(@str,'1',''))) else while charindex('1',@str)>0 begin select @s=isnull(@s+',','')+[text] from [e_SongType] where id=charindex('1',@str) set @str=stuff(@str,1,charindex('1',@str),'0') end return @s end go --调用函数 select ID,Song,Singer,dbo.fn_split(songtype,1) as SongType,dbo.fn_split(songtype,0) as SongTypeCount from song --结果: /* BID Song singer SongType SongTypeCount ----------- ---------- ------ ---------------------- ------------------------ 1 野人的士高 未知 的士高 1 2 光阴的故事 罗大佑 励志,流行 2 3 小酒窝 林俊杰 流行 1 4 我是小沈阳(DJ) 小沈阳 的士高,流行 2 (4 行受影响) */