如何在sql中对空短语进行子串?

时间:2016-09-14 12:25:39

标签: sql sql-server dynamic-sql

我有一个链接,我想将其子串到很多部分以获得数字
例如: -

&OR=-12&MR=24560&MM=20&Mx=110&EOW=1&OW=50&OV=12&CV=-1

我想要-12,24560,20 ......等 我用这段代码做了

DECLARE @strprog AS NVARCHAR(MAX)--,@strLM AS NVARCHAR(20),@strLOW AS NVARCHAR(20),@strLOR AS NVARCHAR(20),@strLCR AS NVARCHAR(20),

DECLARE @OR AS SMALLINT, @MR AS SMALLINT, @MM AS SMALLINT, @Mx AS SMALLINT, @EOW AS SMALLINT, @OW AS SMALLINT, @OV AS SMALLINT, @CV AS SMALLINT

SET @strprog='WorkFlow/WFmain.aspx?sservice=WFAppraisalManage&showrep=1&applyRole=0&DisableApproval=1&grbCompQuest=1&EnablecompletionChk=1
&MaxCompletionNo=110&ProficiencyValidation=0&objresulttxt=0

&OR=-12&MR=24560&MM=20&Mx=110&EOW=1&OW=50&OV=12&CV=-1'


SET @OR= SUBSTRING(@strprog,CHARINDEX('&OR=',@strprog)+4,CASE WHEN CHARINDEX('&',@strprog,CHARINDEX('&OR=',@strprog)+4 ) <=0 THEN LEN(@strprog)+1 ELSE CHARINDEX('&',@strprog,CHARINDEX('&OR=',@strprog)+4 ) END -CHARINDEX('&OR=',@strprog)-4  )
SELECT  @OR

SET @MR= SUBSTRING(@strprog,CHARINDEX('&MR=',@strprog)+4,CASE WHEN CHARINDEX('&',@strprog,CHARINDEX('&MR=',@strprog)+4 ) <=0 THEN LEN(@strprog)+1 ELSE CHARINDEX('&',@strprog,CHARINDEX('&MR=',@strprog)+4 ) END -CHARINDEX('&MR=',@strprog)-4  )
SELECT  @MR

SET @MM= SUBSTRING(@strprog,CHARINDEX('&MM=',@strprog)+4,CASE WHEN CHARINDEX('&',@strprog,CHARINDEX('&MM=',@strprog)+4 ) <=0 THEN LEN(@strprog)+1 ELSE CHARINDEX('&',@strprog,CHARINDEX('&MM=',@strprog)+4 ) END -CHARINDEX('&MM=',@strprog)-4   )
SELECT  @MM

SET @Mx= SUBSTRING(@strprog, CHARINDEX('&Mx=',@strprog)+4 ,CASE WHEN CHARINDEX('&',@strprog,CHARINDEX('&Mx=',@strprog)+4 ) <=0 THEN LEN(@strprog)+1 ELSE CHARINDEX('&',@strprog,CHARINDEX('&Mx=',@strprog)+4 ) END -CHARINDEX('&Mx=',@strprog)-4  )
SELECT  @Mx

SET @EOW= SUBSTRING(@strprog,CHARINDEX('&EOW=',@strprog)+5,CASE WHEN CHARINDEX('&',@strprog,CHARINDEX('&EOW=',@strprog)+5 ) <=0 THEN LEN(@strprog)+1 ELSE CHARINDEX('&',@strprog,CHARINDEX('&EOW=',@strprog)+5 ) END -CHARINDEX('&EOW=',@strprog)-5 )
SELECT  @EOW

SET @OW= SUBSTRING(@strprog,CHARINDEX('&OW=',@strprog)+4,CASE WHEN CHARINDEX('&',@strprog,CHARINDEX('&OW=',@strprog)+4 ) <=0 THEN LEN(@strprog)+1 ELSE CHARINDEX('&',@strprog,CHARINDEX('&OW=',@strprog)+4 ) END -CHARINDEX('&OW=',@strprog)-4  )
SELECT  @OW

SET @OV= SUBSTRING(@strprog,CHARINDEX('&OV=',@strprog)+4,CASE WHEN CHARINDEX('&',@strprog,CHARINDEX('&OV=',@strprog)+4 ) <=0 THEN LEN(@strprog)+1 ELSE CHARINDEX('&',@strprog,CHARINDEX('&OV=',@strprog)+4 ) END -CHARINDEX('&OV=',@strprog)-4  )
SELECT  @OV

SET @CV= SUBSTRING(@strprog,CHARINDEX('&CV=',@strprog)+4,CASE WHEN CHARINDEX('&',@strprog,CHARINDEX('&CV=',@strprog)+4 ) <=0 THEN LEN(@strprog)+1 ELSE CHARINDEX('&',@strprog,CHARINDEX('&CV=',@strprog)+4 ) END -CHARINDEX('&CV=',@strprog)-4  )
SELECT  @CV

问题是链接可能会在任何地方被切断 例如: -

&OR=-12&MR=24560&MM=20

如何在结束时停止切割? 有什么帮助吗?

4 个答案:

答案 0 :(得分:2)

您可以在MSSQL服务器中使用XML类型将字符串分隔为行,并获得包含attributevalue列的表。然后,您可以从此行集中选择所需的任何属性:

DECLARE @strprog AS NVARCHAR(MAX);

SET @strprog='WorkFlow/WFmain.aspx?sservice=WFAppraisalManage&showrep=1&
applyRole=0&DisableApproval=1&grbCompQuest=1&EnablecompletionChk=1
&MaxCompletionNo=110&ProficiencyValidation=0&objresulttxt=0
&OR=-12&MR=24560&MM=20&Mx=110&EOW=1&OW=50&OV=12&CV=-1';

DECLARE @xml as XML;
SET @xml = cast(('<X>'+replace(@strprog,'&' ,'</X><X>')+'</X>') as xml);

WITH T2 as
(
  SELECT N.value('.', 'varchar(1000)') as val FROM @xml.nodes('X') as T(N)
)
SELECT LEFT(val,CHARINDEX('=',val)-1) as attribute,
       SUBSTRING(val,CHARINDEX('=',val)+1,1000) as value
       FROM T2;

您获得以下行集:

╔═══════════════════════════════╦═══════════════════╗
║           attribute           ║       value       ║
╠═══════════════════════════════╬═══════════════════╣
║ WorkFlow/WFmain.aspx?sservice ║ WFAppraisalManage ║
║ showrep                       ║ 1                 ║
║ applyRole                     ║ 0                 ║
║ DisableApproval               ║ 1                 ║
║ grbCompQuest                  ║ 1                 ║
║ EnablecompletionChk           ║ 1                 ║
║ MaxCompletionNo               ║ 110               ║
║ ProficiencyValidation         ║ 0                 ║
║ objresulttxt                  ║ 0                 ║
║ OR                            ║ -12               ║
║ MR                            ║ 24560             ║
║ MM                            ║ 20                ║
║ Mx                            ║ 110               ║
║ EOW                           ║ 1                 ║
║ OW                            ║ 50                ║
║ OV                            ║ 12                ║
║ CV                            ║ -1                ║
╚═══════════════════════════════╩═══════════════════╝

答案 1 :(得分:0)

所有子串都被等号抢占,并以&符号结束。 为什么不创建一个循环来获取字符串,从第一个获取值等于&符号,删除从字符串处理的字符串部分并继续对字符串的其余部分执行相同操作?

答案 2 :(得分:0)

您可以在设置每个变量之前检查每个标记的CHARINDEX,以查看该标记是否甚至存在于字符串中。

答案 3 :(得分:0)

DECLARE @strprog AS NVARCHAR(MAX)--,@strLM AS NVARCHAR(20),@strLOW AS NVARCHAR(20),@strLOR AS NVARCHAR(20),@strLCR AS NVARCHAR(20),

DECLARE @OR AS SMALLINT, @MR AS SMALLINT, @MM AS SMALLINT, @Mx AS SMALLINT, @EOW AS SMALLINT, @OW AS SMALLINT, @OV AS SMALLINT, @CV AS SMALLINT



--SELECT @MR =0, @MM =0, @Mx=0 , @EOW=0, @OW =0, @OV=0


--&OR=-12&MR=24560&MM=20&Mx=110&EOW=1&OW=50&OV=12&CV=-1

SET @strprog='WorkFlow/WFmain.aspx?sservice=WFAppraisalManage&showrep=1&applyRole=0&DisableApproval=1&grbCompQuest=1&EnablecompletionChk=1
&MaxCompletionNo=110&ProficiencyValidation=0&objresulttxt=0

&OR=-12&MR=24560&Mx=110&EOW=1&OW=50&OV=12'

IF CHARINDEX('&OR=',@strprog) <> 0
SET @OR= SUBSTRING(@strprog,CHARINDEX('&OR=',@strprog)+4,CASE WHEN CHARINDEX('&',@strprog,CHARINDEX('&OR=',@strprog)+4 ) <=0 THEN LEN(@strprog)+1 ELSE CHARINDEX('&',@strprog,CHARINDEX('&OR=',@strprog)+4 ) END -CHARINDEX('&OR=',@strprog)-4  )
SELECT  @OR

IF CHARINDEX('&MR=',@strprog) <> 0
SET @MR= SUBSTRING(@strprog,CHARINDEX('&MR=',@strprog)+4,CASE WHEN CHARINDEX('&',@strprog,CHARINDEX('&MR=',@strprog)+4 ) <=0 THEN LEN(@strprog)+1 ELSE CHARINDEX('&',@strprog,CHARINDEX('&MR=',@strprog)+4 ) END -CHARINDEX('&MR=',@strprog)-4  )
SELECT  @MR

IF CHARINDEX('&MM=',@strprog) <> 0
SET @MM= SUBSTRING(@strprog,CHARINDEX('&MM=',@strprog)+4,CASE WHEN CHARINDEX('&',@strprog,CHARINDEX('&MM=',@strprog)+4 ) <=0 THEN LEN(@strprog)+1 ELSE CHARINDEX('&',@strprog,CHARINDEX('&MM=',@strprog)+4 ) END -CHARINDEX('&MM=',@strprog)-4   )
SELECT  @MM

IF CHARINDEX('&Mx=',@strprog) <> 0
SET @Mx= SUBSTRING(@strprog, CHARINDEX('&Mx=',@strprog)+4 ,CASE WHEN CHARINDEX('&',@strprog,CHARINDEX('&Mx=',@strprog)+4 ) <=0 THEN LEN(@strprog)+1 ELSE CHARINDEX('&',@strprog,CHARINDEX('&Mx=',@strprog)+4 ) END -CHARINDEX('&Mx=',@strprog)-4  )
SELECT  @Mx

IF CHARINDEX('&EOW=',@strprog) <> 0
SET @EOW= SUBSTRING(@strprog,CHARINDEX('&EOW=',@strprog)+5,CASE WHEN CHARINDEX('&',@strprog,CHARINDEX('&EOW=',@strprog)+5 ) <=0 THEN LEN(@strprog)+1 ELSE CHARINDEX('&',@strprog,CHARINDEX('&EOW=',@strprog)+5 ) END -CHARINDEX('&EOW=',@strprog)-5 )
SELECT  @EOW

IF CHARINDEX('&OW=',@strprog) <> 0
SET @OW= SUBSTRING(@strprog,CHARINDEX('&OW=',@strprog)+4,CASE WHEN CHARINDEX('&',@strprog,CHARINDEX('&OW=',@strprog)+4 ) <=0 THEN LEN(@strprog)+1 ELSE CHARINDEX('&',@strprog,CHARINDEX('&OW=',@strprog)+4 ) END -CHARINDEX('&OW=',@strprog)-4  )
SELECT  @OW

IF CHARINDEX('&OV=',@strprog) <> 0
SET @OV= SUBSTRING(@strprog,CHARINDEX('&OV=',@strprog)+4,CASE WHEN CHARINDEX('&',@strprog,CHARINDEX('&OV=',@strprog)+4 ) <=0 THEN LEN(@strprog)+1 ELSE CHARINDEX('&',@strprog,CHARINDEX('&OV=',@strprog)+4 ) END -CHARINDEX('&OV=',@strprog)-4  )
SELECT  @OV

IF CHARINDEX('&CV=',@strprog) <> 0
Set @CV= SUBSTRING(@strprog,CHARINDEX('&CV=',@strprog)+4,CASE WHEN CHARINDEX('&',@strprog,CHARINDEX('&CV=',@strprog)+4 ) <=0 THEN LEN(@strprog)+1 ELSE CHARINDEX('&',@strprog,CHARINDEX('&CV=',@strprog)+4 ) END -CHARINDEX('&CV=',@strprog)-4  )
SELECT  @CV