2016-09-14 2 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

Вы можете использовать XML-тип на сервере MSSQL для разделения строки на строки и получить таблицу с столбцами attribute и value. Затем вы можете выбрать любой атрибут, который нужно из этого набора строк:

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