首页 > 解决方案 > TSQL - 提取两个单词之间的文本

问题描述

我确实在网站上找到了一些信息,但我无法使其正常工作。我有一个文本字段 [User],其中包含 USER: John.Smith SessionId: {There is a space after User: and one after the name}

我尝试的所有内容都将删除第一部分或最后一个部分,没有一个会同时删除。或者会给我这个消息 Invalid length parameter passing to the LEFT or SUBSTRING function

我想从该字段中提取名称 John.Smith。如果可能的话,我不想声明任何表。

谢谢

标签: sqlsql-server

解决方案


如果对 TVF 开放

例子

Select A.ID
      ,B.*
 From  YourTable A
 Cross Apply [dbo].[tvf-Str-Extract](SomeCol,'USER:','SessionId:') B

退货

ID  RetSeq  RetVal
1   1       John.Smith 

感兴趣的功能

CREATE FUNCTION [dbo].[tvf-Str-Extract] (@String varchar(max),@Delim1 varchar(100),@Delim2 varchar(100))
Returns Table 
As
Return (  

    Select RetSeq = row_number() over (order by RetSeq)
          ,RetVal = left(RetVal,charindex(@Delim2,RetVal)-1)
    From  (
            Select RetSeq = row_number() over (order by 1/0)
                  ,RetVal = ltrim(rtrim(B.i.value('(./text())[1]', 'varchar(max)')))
            From  ( values (convert(xml,'<x>' + replace((Select replace(@String,@Delim1,'§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>').query('.'))) as A(XMLData)
            Cross Apply XMLData.nodes('x') AS B(i)
          ) C1
    Where charindex(@Delim2,RetVal)>1
)
/*
Declare @String varchar(max) = 'Dear [[FirstName]] [[LastName]], ...'
Select * From [dbo].[tvf-Str-Extract] (@String,'[[',']]')
*/

推荐阅读