Вообще OMG Ponies определенно прав!Но если вам действительно нужно это сделать, посмотрите на этот пример кода (надеюсь, он действителен для SQL Server 2000):
create table #t (Blog_ID int, Title varchar(50), Tag varchar(4000));
insert into #t select 1, 'AAA', 'T1|T2|T3';
insert into #t select 2, 'BBB', 'T2|T4';
insert into #t select 3, 'CCC', 'T3|T1|T2|T6';
select Tag, count(*) as AppearanceCount from (
select substring(t.Tag,
a.n+b.n+c.n+d.n+e.n+f.n+g.n+h.n+i.n+j.n+k.n+l.n,
charindex('|',t.Tag+'|',a.n+b.n+c.n+d.n+e.n+f.n+g.n+h.n+i.n+j.n+k.n+l.n)
- (a.n+b.n+c.n+d.n+e.n+f.n+g.n+h.n+i.n+j.n+k.n+l.n)) as Tag
from (select 0 as n union select 1) a,
(select 0 as n union select 2) b,
(select 0 as n union select 4) c,
(select 0 as n union select 8) d,
(select 0 as n union select 16) e,
(select 0 as n union select 32) f,
(select 0 as n union select 64) g,
(select 0 as n union select 128) h,
(select 0 as n union select 256) i,
(select 0 as n union select 512) j,
(select 0 as n union select 1024) k,
(select 0 as n union select 2048) l,
#t t
where substring('|'+t.Tag,a.n+b.n+c.n+d.n+e.n+f.n+g.n+h.n+i.n+j.n+k.n+l.n,1)='|'
) x
group by Tag;
drop table #t;
Вы можете (и, возможно, должны) использовать UDF для генерации чисел.Читать намного легче:
seelct Tag, count(*) as AppearanceCount from (
select substring(t.Tag, n.n, charindex('|',t.Tag+'|',n.n) as Tag
from dbo.fn_Numbers(4000) n cross join #t t
where substring('|'+t.Tag,n.n,1)='|') x group by Tag;
(Спасибо Ицик Бен-Ган)