2011-10-28 105 views
4

我找不到一个好的方法来做到这一点,由于一些限制,它必须是一个不使用变量的编码,但我可以调用一个函数。无论如何,我需要从Select查询返回一个结果集,其中一行是一个管道分隔字符串。SQL解析分隔字符串

所以,它会返回类似:

id| Name  | Message | 
--------------------- 
1 | Some Name | 'Here is my | delimited | message' 

,我需要它是

id| Name  | Message1  | Message2 | Message3 
------------------------------------------------------ 
1 | Some Name | 'Here is my' | 'delimited' | 'message' 

我想的有点像Parsename('','|',1),在那里你可以在分隔符通过它来代替始终是一个时期,但我不知道实现这一目标的最佳方法。

编辑:我试过的这个变化,但当然是非常混乱。可能有4个或更多| |

SELECT Field1, 
Field2 AS Originalvalue, 
--1 
SUBSTRING(Field2,0,CHARINDEX('|',Field2)) AS Msg1, 
--2 
LEFT(SUBSTRING(Field2,CHARINDEX('|',Field2)+1 ,LEN(Field2)),CHARINDEX('|',SUBSTRING(Field2,CHARINDEX('|',Field2)+1 ,LEN(Field2)))-1) 
AS ExtractedValue 
FROM Table1 T1 JOIN Table2 T2 
ON T1.Id = T2.Id 
WHERE T1.Id = 12 
+3

为什么人们[继续这样做(http://stackoverflow.com/search?q=sql+delimited)? – Phil

+4

管道分隔的字段使SQL仙子死亡 – scrappedcola

+0

嗯,人们不回答这个网站上的问题吗?这似乎是很多“去看看谷歌”。我一直在寻找一个多小时,我还没有找到我正在寻找的东西。 – user204588

回答

8

您可以按如下方式编写sql函数。

create Function dbo.fn_Parsename(@Message Varchar(1000), @delimiter char(1), @index int) 
Returns Varchar(1000) 
As 
Begin 
    Declare 
     @curIndex int = 0, 
     @pos int = 1, 
     @prevPos int = 0, 
     @result varchar(1000) 

    while @pos > 0 
    Begin 

     set @pos = CHARINDEX(@delimiter, @Message, @prevPos); 

     if(@pos > 0) 
     begin-- get the chars between the prev position to next delimiter pos 
      set @result = SUBSTRING(@message, @prevPos, @[email protected]) 
     end 
     else 
     begin--get last delim message 
      set @result = SUBSTRING(@message, @prevPos, LEN(@message)) 
     end 

     if(@index = @curIndex) 
     begin 
      return @result 
     end 

     set @prevPos = @pos + 1 
     set @curIndex = @curIndex + 1; 

    end 
    return ''--not found 
End 

而且你可以按照以下称之为:

select dbo.fn_Parsename('Here is my | delimited | message','|', 0) 
select dbo.fn_Parsename('Here is my | delimited | message','|', 1) 
select dbo.fn_Parsename('Here is my | delimited | message','|', 2) 
+1

一起工作太棒了!非常感谢。对此,我真的非常感激。 – user204588