2016-09-14 14 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 
関連する問題