在SqlServer2008R2中,根据分隔符把一列的值切割成多列

近期工作中,有个如上图效果的需求:将一个字段里面的值,以“,"切割成多列

 

通过思考、搜索,在网上找到了博主Microshaoft的文章:

妙用 T-SQL: PARSENAME 函数 (也可不使用该函数,鸣谢"小杰") 实现按指定分隔符拆分字符串 SplitString

原帖地址:http://www.cnblogs.com/Microshaoft/archive/2005/05/10/152325.html

在此,感谢博主及为此付出的朋友!

 

下面,创库、表、测试数据学习下。

create database TestDB
go

use TestDB
go

create table TestDB.dbo.testTab(
    tId bigint identity(1,1) NOT NULL,
    tField nvarchar(100) null
)
go

insert into TestDB.dbo.testTab values('仙桃西-汉口,武汉-仙桃西')
insert into TestDB.dbo.testTab values('上海-仙桃西')
insert into TestDB.dbo.testTab values('北京-上海-深圳,北京-武汉,深圳-上海-北京,武汉-北京')
insert into TestDB.dbo.testTab values('上海-北京,上海-武汉-重庆,北京-上海,重庆-武汉-上海')
insert into TestDB.dbo.testTab values('杭州-上海-北京,西藏-武汉,武汉-西藏,武汉-成都')
insert into TestDB.dbo.testTab values('成都-北京-哈尔滨,哈尔滨-北京,杭州-上海,广州-武汉,成都-上海,上海-武汉')

select * from TestDB.dbo.testTab

 

--创建函数
use TestDB
go

create function dbo.SplitSubString 
( 
 @Expression varchar(8000) 
,@Delimiter varchar(100) 
,@ int 
) 
returns varchar(8000) 
as 
begin 


declare @p int 
set @p = CharIndex(@Delimiter,@Expression) 
if @p > 0
begin
   set @p = @p + len(@Delimiter) - 1
end
declare @i int 
set @i = 1 
while @i < @ 
begin  
   set @i = @i + 1
   set @Expression = substring (@Expression, @p + 1,len(@Expression) - @p ) 
   set @p = CharIndex(@Delimiter,@Expression)
   if @p > 0
   begin
      set @p = @p + len(@Delimiter) - 1
   end
   else
   begin
      break
   end
end 

declare @s varchar(1000) 
if @p = 0 and @i = @
begin 
   set @s = @Expression
end 
else if @i = @ 
begin 
   set @s = substring(@Expression, 1,@p - len(@Delimiter)) 
end 
return @s
end 

GO

 

--查询
select tField
,TestDB.dbo.SplitSubString(tField,',',1) as tField1
,TestDB.dbo.SplitSubString(tField,',',2) as tField2
,TestDB.dbo.SplitSubString(tField,',',3) as tField3
,TestDB.dbo.SplitSubString(tField,',',4) as tField4
,TestDB.dbo.SplitSubString(tField,',',5) as tField5
,TestDB.dbo.SplitSubString(tField,',',6) as tField6
from TestDB.dbo.testTab

函数说明:dbo.SplitSubString(字段名,分隔符,第几段)

 

有问题,留言讨论,谢谢!

posted @ 2016-03-24 17:26  陈哲Gilbert  阅读(4987)  评论(0编辑  收藏  举报