日期:2014-05-18 浏览次数:20633 次
create FUNCTION f_splitSTR( @s varchar(8000), --待分拆的字符串 @split varchar(10) --数据分隔符 )RETURNS @re TABLE(row tinyint,col varchar(100)) AS BEGIN DECLARE @splitlen int, @Row tinyint set @row = 1 SET @splitlen=LEN(@split+'a')-2 WHILE CHARINDEX(@split,@s)>0 BEGIN if (len(replace( LEFT(@s,CHARINDEX(@split,@s)-1),' ',''))>=1) begin INSERT @re VALUES(@row,LEFT(@s,CHARINDEX(@split,@s)-1)) set @Row = @row + 1 end SET @s=STUFF(@s,1,CHARINDEX(@split,@s)+@splitlen,'') END if (len(replace(@s,' ',''))>=1) begin INSERT @re VALUES(@row,@s) end RETURN END GO declare @t table ( r nvarchar(64)) insert into @t select '港389 油压上限值 16.00修改为: 3.00 | 李雷' union all select '港65 油压上限值 16.00修改为: 3.00' union all select '港356 油压上限值 16.00修改为: 3.00 | 李雷 红香' union all select '港356 油压上限值 16.00修改为: 3.00 | 范红 红香' union all select '港356 油压下限值 1.00修改为: 0.00 | 李雷 李伟' select case when charindex('|',r)>= 1 then left(r, charindex('|',r)-1) else r end as [维护记录], (select col from dbo.f_splitSTR(case when charindex('|',r)>= 1 then right(r, len(r)-charindex('|',r)) else null end ,' ') where row = 1 ) as [维护人], (select col from dbo.f_splitSTR(case when charindex('|',r)>= 1 then right(r, len(r)-charindex('|',r)) else null end ,' ') where row = 2 ) as [审核人] from @t a /* (5 行受影响) 维护记录 维护人 审核人 ---------------------------- ---------------------------------------------------------------- ---------------------------------------------------------------- 港389 油压上限值 16.00修改为: 3.00 李雷 NULL 港65 油压上限值 16.00修改为: 3.00 NULL NULL 港356 油压上限值 16.00修改为: 3.00 李雷 红香 港356 油压上限值 16.00修改为: 3.00 范红 红香 港356 油压下限值 1.00修改为: 0.00 李雷 李伟 (5 行受影响) */
------解决方案--------------------
--准备测试数据
create table a_R(WR nvarchar(100))
insert into a_R
values('港389 油压上限值 16.00修改为: 3.00 | 李雷 ')
insert into a_R
values('港65 油压上限值 16.00修改为: 3.00')
insert into a_R
values('港356 油压上限值 16.00修改为: 3.00 | 李雷 红香')
insert into a_R
values('港356 油压上限值 16.00修改为: 3.00 | 范红 红香')
insert into a_R
values('港356 油压下限值 1.00修改为: 0.00 | 李雷 李伟')
--实现你要的查询结果
select WR, (case when WR like '% | %' then Left(WR,Charindex(' | ',WR,1)-1) else WR end) as [维护记录],