如何:UDF函数提取子字符串?

时间:2018-04-30 10:38:14

标签: sql-server string user-defined-functions

如何从输入字符串中提取子字符串

'{\lang1252 All rights reserved}'

即。通常情况下是

1){\ lettersdigits \ lettersdigits \ lettersdigits任何纯文本} 2){\ lettersdigits文本\ lettersdigits part2 \ lettersdigits任何纯文本}

预期结果如下: 1)任何纯文本 2)文本part2任何纯文本

命令启动\,然后是字母,然后是可选数字。 此外,如果命令没有从\开始,则它是文本,应该作为文本提取。

1 个答案:

答案 0 :(得分:1)

你可以reverse字符串,找到' \'的第一次出现的索引。使用charindex并使用substring查找所需的输出。

尝试以下。

declare @var varchar(100)='{\lettersdigits \letters123 \lettersdigit45 any plain text}'
select substring(col,patindex('% %', col), len(col)- patindex('% %', col))
from
 (
   select  reverse(substring(reverse(@var),2,charindex('\',reverse(@var))-2)) col
  ) t

<强> DEMO

修改(根据问题更新):

您可以创建以下代码的缩放器值函数,它将适合您。

declare @xml  xml
declare @str as varchar(100)
declare @output varchar(max)
--SET @str='{\lettersdigits \lettersdigits \lettersdigits any plain text}'
SET @str='{\lettersdigits The text \lettersdigits the part2 \lettersdigits any plain text}'
select @xml =  cast(('<X>'+replace(@str,'\' ,'</X><X>')+'</X>') as xml) 
select @output= output from
(
    select stuff(
    (
        select substring(col,patindex('% %', col), len(col)- patindex('% %', col)+1) from
        (
            select replace(replace(value,'}',''),'{','') col from
            (
               SELECT LTRIM(N.value('.', 'varchar(100)')) as value FROM @xml.nodes('X') as T(N)
            ) t1
        ) t2
    for xml path('')),1,1,'') as [output]
) t
select @output

<强> DEMO 2