2016-09-14 51 views
1

我有一个链接,我想它的子字符串成许多碎片拿到号码
例如: -如何在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 

如何在停止切割时停止切割? 有帮助吗?

+0

使用分割功能,而不是 –

回答

0

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

+0

环路是分割字符串的非常低效的方式。 –

+0

作为一切,它取决于你想用循环和你必须处理的字符串的数量来实现什么...... –

+0

不是这种情况。使用循环来分割字符串是一个非常糟糕的方式来做到这一点。您可能没有注意到小数据集上的性能,但有比循环更好的选项。这里有几个。 http://sqlperformance.com/2012/07/t-sql-queries/split-strings –

0

您可以在设置每个变量之前检查每个令牌的CHARINDEX,以查看该令牌是否完全存在于字符串中。

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    ║ 
╚═══════════════════════════════╩═══════════════════╝ 
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 
相关问题