|
我找不到执行此操作的好方法,由于某些限制,我必须在不使用变量的情况下编码它,但我可以调用函数。无论如何,我需要从Select查询返回结果集,其中一行为管道分隔字符串。# g' g" y$ v- L5 h: m" n$ G- a4 m
因此,它将返回类似于以下内容的内容:( R8 s* c4 T/ z: C& S) y0 ^
id| Name | Message |---------------------1 | Some Name | 'Here is my | delimited | message'我需要它成为1 V8 @7 S a5 v: ~ Q' y- ]
id| Name | Message1 | Message2 | Message3------------------------------------------------------1 | Some Name | 'Here is my' | 'delimited' | 'message'我在想类似的事情Parsename('','|你可以输入定界符而不是总是输入句点,但我不知道实现这一目标的最佳方法。
6 R3 O' y3 q3 I/ T编辑:我试过这个变化,但当然很迷茫。可能有四个或更多。|% h4 T5 G' G/ R' U! H" p3 E. a
SELECT Field1,Field2 AS Originalvalue,--1SUBSTRING(Field2,0,CHARINDEX('|',Field2)) AS Msg1,--2LEFT(SUBSTRING(Field2,CHARINDEX('|',Field2) 1 ,LEN(Field2)),CHARINDEX('|',SUBSTRING(Field2,CHARINDEX('|',Field2) 1 ,LEN(Field2)))-1)AS ExtractedValueFROM Table1 T1 JOIN Table2 T2ON T1.Id = T2.IdWHERE T1.Id = 122
& F- i6 F! U1 o- z 解决方案: ; h$ H% q9 d- y5 q. I/ M: m" M4 j i
你可以写一个sql函数,如下所示。4 P' A# h3 i8 T, |
create Function dbo.fn_Parsename(@Message Varchar(1000),@delimiter char(1),@index int )Returns Varchar(1000)AsBegin 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,@pos-@prevPos) 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 set @curIndex = @curIndex 1; end return ''--not foundEnd按以下方法调用:
% \" F- _8 a+ X$ g1 Dselect 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) |
|