如何从SQL消息中查找子字符串?

如何从SQL消息中查找子字符串?,sql,sql-server,database,Sql,Sql Server,Database,我有如下数据:- 1) 您指定的承运人是{carrier\u name}。他们很快就会联系你安排接机,但请随时拨打{carrier_phone}和{reference_id}联系他们。它们现在开放,将一直持续到{关闭时间} 2) {vehicle_owner}表示他们的{body_style}被捡走了。你会提供作业的最新信息还是将其标记为完成 我想找到括号->{{uuu}之间的所有值 括号之间只能找到特定的消息。他们之间可能有任何价值 如何使用查询找到它?如果字符串始终遵循重复模式'..{..}

我有如下数据:-

1) 您指定的承运人是{carrier\u name}。他们很快就会联系你安排接机,但请随时拨打{carrier_phone}和{reference_id}联系他们。它们现在开放,将一直持续到{关闭时间}

2) {vehicle_owner}表示他们的{body_style}被捡走了。你会提供作业的最新信息还是将其标记为完成

我想找到括号->
{{uuu}
之间的所有值

括号之间只能找到特定的消息。他们之间可能有任何价值


如何使用查询找到它?

如果字符串始终遵循重复模式
'..{..}
解决此问题的一种方法是使用Jeff Moden的CSV拆分器函数,将第二个分隔符替换为第一个分隔符,并使用以下方法仅获取第二组:

测试设置:

返回:

+----+---------------+
| Id |      col      |
+----+---------------+
|  1 | carrier_name  |
|  1 | carrier_phone |
|  1 | reference_id  |
|  1 | close_time    |
|  2 | vehicle_owner |
|  2 | body_style    |
+----+---------------+
+----+---------------+
| Id |      col      |
+----+---------------+
|  1 | carrier_name  |
|  1 | carrier_phone |
|  1 | reference_id  |
|  1 | close_time    |
|  2 | vehicle_owner |
|  2 | body_style    |
+----+---------------+
拆分字符串引用:


测试中使用的功能:

create function [dbo].[delimitedsplit8K] (
      @pstring varchar(8000)
    , @pdelimiter char(1)
  )
returns table with schemabinding as
 return
  with e1(N) as (
    select 1 union all select 1 union all select 1 union all 
    select 1 union all select 1 union all select 1 union all 
    select 1 union all select 1 union all select 1 union all select 1
  )
  , e2(N) as (select 1 from e1 a, e1 b)
  , e4(N) as (select 1 from e2 a, e2 b)
  , ctetally(N) as (
    select top (isnull(datalength(@pstring),0)) 
      row_number() over (order by (select null)) from e4
  )
  , ctestart(N1) as (
    select 1 union all
    select t.N+1 from ctetally t where substring(@pstring,t.N,1) = @pdelimiter
  )
  , ctelen(N1,L1) as (
    select s.N1,
      isnull(nullif(charindex(@pdelimiter,@pstring,s.N1),0)-s.N1,8000)
    from ctestart s
  )
 select itemnumber = row_number() over(order by l.N1)
      , item       = substring(@pstring, l.N1, l.L1)
   from ctelen l
;

递归cte版本(无需附加功能)

返回:

+----+---------------+
| Id |      col      |
+----+---------------+
|  1 | carrier_name  |
|  1 | carrier_phone |
|  1 | reference_id  |
|  1 | close_time    |
|  2 | vehicle_owner |
|  2 | body_style    |
+----+---------------+
+----+---------------+
| Id |      col      |
+----+---------------+
|  1 | carrier_name  |
|  1 | carrier_phone |
|  1 | reference_id  |
|  1 | close_time    |
|  2 | vehicle_owner |
|  2 | body_style    |
+----+---------------+
这可以通过子字符串CHARINDEX


CHARINDEX给出搜索字符串第一次出现的值。在子字符串中提供这些值,可以获得所需的输出。

添加一些示例表数据和预期结果,以及格式良好的文本。同时显示您当前的查询尝试。这是格式化数据。这里,1是id,2是消息@Jarlh不工作。我的表名是[Tbl_BotMessageLibrary],列是[Id]和[Message]。此查询将在数据库上启动。对于此答案,您需要创建用于拆分值的函数。该函数在第一个参考中,在rextester测试链接中,现在也在答案的底部。@DeepJadia添加了一个递归cte版本,它不需要函数。
SUBSTRING(@Text, CHARINDEX('%{%',@Text), CHARINDEX('%}%',@Text))