我找不到执行此操作的好方法,并且由于某些限制,必须在不使用变量的情况下对其进行编码,但是我可以调用函数。无论如何,我需要从Select查询返回一个结果集,其中的一行是管道分隔的字符串。
因此,它将返回类似以下内容的内容:
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),您可以传入定界符而不是始终输入一个句点,但我不知道实现此目标的最佳方法。
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
您可以编写一个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, @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 + 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)