SQL Server:从特定列中的字符串获取SO编号

SQL Server:从特定列中的字符串获取SO编号,sql,sql-server,Sql,Sql Server,我有一个名为PONDAILY的表,它有一个名为dponcom的列。PONCOM有类似文本注释的字符串内容,我只需要从字符串中提取SO编号,下面是列中数据的外观示例,突出显示的是我要检索的内容。我不能使用任何自定义项,因为我只有对SQL server的读取权限 DELETE TO EXPEDITE ON NEW STO FOR M/D SO SAP# **5000068**. HN04 DELETING FOR M/D SO#**4500000762** KF 03-31 REDUCED B

我有一个名为PONDAILY的表,它有一个名为dponcom的列。PONCOM有类似文本注释的字符串内容,我只需要从字符串中提取SO编号,下面是列中数据的外观示例,突出显示的是我要检索的内容。我不能使用任何自定义项,因为我只有对SQL server的读取权限

DELETE TO EXPEDITE ON NEW STO FOR M/D SO SAP# **5000068**.  HN04

DELETING FOR M/D SO#**4500000762** KF 03-31

REDUCED BY 1 TO EXPEIDTE FOR M/D SO**100471**...CSR EM...HN04040

REDUCED QTY BY 1 TO EXPEDITE FOR M/D SO SAP **100551**. HN040300

REDUCED QTY BY 1 TO EXPEDITE FOR M/D SO SAP **100551**/1. HN040300

REDUCED BY QTY1 FOR M/D SO# **105707**

REDUCED QTY BY 3 FOR M/D SO#S **5003785**, 5003786, 5003791 KF 0

如果我正确理解问题,我只想获取粗体的内容:

select substring(PONCOM, t2.num, case when t3.not_num < t2.num then 8000 else t3.not_num - t2.num end)
  from PONDAILY p 
   cross apply (select charindex('SO', PONCOM, 1)) t1(so)
   cross apply (select patindex('%[0-9]%', substring(PONCOM, t1.so, 8000)) + t1.so - 1) t2(num)
   cross apply (select patindex('%[^0-9]%', substring(PONCOM, t2.num, 8000)) + t2.num - 1) t3(not_num)

我认为它工作得很好,但我没有看到像这样的行的输出:CCdddD 02,7001032 hftfLIPS,SO2300.RW245588,所以1000471*KFE 040400这很奇怪,因为我看到了这行的结果:CCdddD 02,7001032 hftfLIPS,SO2300.RW245588,所以1000471*KFE 040400好,非常感谢。我们可以避免只返回数字的字段,因为它只返回数字。示例0085128558是字段值,列返回值为0085128558Yes,需要添加一个条件:其中t1.so>0