SQL Server實現split功能

<ol class="dp-sql" start="1"><li class="alt"><span><span class="comment">--實現split功能 的函數
</span><span>  
</span></span></li><li class="alt"><span><span>
</span></span></li><li><span><span class="keyword">create</span><span> </span><span class="keyword">function</span><span> f_split(@SourceSql </span><span class="keyword">varchar</span><span>(8000),@StrSeprate </span><span class="keyword">varchar</span><span>(10))  </span></span></li><li class="alt"><span><span class="keyword">returns</span><span> @</span><span class="keyword">temp</span><span> </span><span class="keyword">table</span><span>(a </span><span class="keyword">varchar</span><span>(100))  </span></span></li><li><span><span class="keyword">as</span><span>   </span></span></li><li class="alt"><span><span class="keyword">begin</span><span>  </span></span></li><li><span><span class="keyword">declare</span><span> @i </span><span class="keyword">int</span><span>  </span></span></li><li class="alt"><span><span class="keyword">set</span><span> @SourceSql=rtrim(ltrim(@SourceSql))  </span></span></li><li><span><span class="keyword">set</span><span> @i=charindex(@StrSeprate,@SourceSql)  </span></span></li><li class="alt"><span>while @i>=1  </span></li><li><span><span class="keyword">begin</span><span>  </span></span></li><li class="alt"><span><span class="keyword">insert</span><span> @</span><span class="keyword">temp</span><span> </span><span class="keyword">values</span><span>(</span><span class="func">left</span><span>(@SourceSql,@i-1))  </span></span></li><li><span><span class="keyword">set</span><span> @SourceSql=</span><span class="func">substring</span><span>(@SourceSql,@i+1,len(@SourceSql)-@i)  </span></span></li><li class="alt"><span><span class="keyword">set</span><span> @i=charindex(@StrSeprate,@SourceSql)  </span></span></li><li><span><span class="keyword">end</span><span>  </span></span></li><li class="alt"><span>if @SourceSql<><span class="string">'\'</span><span>  </span></span></li><li><span><span class="keyword">insert</span><span> @</span><span class="keyword">temp</span><span> </span><span class="keyword">values</span><span>(@SourceSql)  </span></span></li><li class="alt"><span><span class="keyword">return</span><span>   </span></span></li><li><span><span class="keyword">end</span><span>  </span></span></li><li class="alt"><span>  </span></li><li><span>go  
</span></li></ol>

--> 測試數據:[a]
if object_id('[a]') is not null drop table [a]
go 
create table [a]([xueke] varchar(50),[hits] int)
insert [a]
select '數學,語文',2 union all
select '語文,英語',3 union all
select '化學,物理',4 union all
select '物理,生物',6 union all
select '化學',3

if object_id('[b]') is not null drop table [b]
go 
create table [b]([xueke] varchar(50),[hits] int)


select row_number() over(order by xueke ) as rn,* into #a from a

declare @i int ,@j int ,@k varchar(10),@l int
set @i =1 
select @j=max(rn) from #a
while(@i<=@j)
begin 
select @k=[xueke],@l= [hits] from #a where rn =@i
insert into b select a,@l from  dbo.f_split(@k,',')
set @i=@i+1
end 
select xueke ,sum(hits) as hits from b group by xueke
xueke                                              hits
-------------------------------------------------- -----------
化學                                                 7
生物                                                 6
數學                                                 2
物理                                                 10
英語                                                 3
語文                                                 5

(6 行受影響)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章