2017-05-14 89 views
0

我試圖打破一個字符串在未來 '|!':增加dilimited串不解析正確

DECLARE @value varchar(max) = 'A750!|!none!|!none!|!N' 
DECLARE @test varchar(max) = Replace(@value, '!|!', '.'); 

declare @my1 varchar(500) = (SELECT ParseName(@test, 1)) 
declare @my2 varchar(500) = (SELECT ParseName(@test, 2)) 
declare @my3 varchar(500) = (SELECT ParseName(@test, 3)) 
declare @my4 varchar(500) = (SELECT ParseName(@test, 4)) 
declare @my5 varchar(500) = (SELECT ParseName(@test, 5)) 
declare @my6 varchar(500) = (SELECT ParseName(@test, 6)) 
declare @my7 varchar(500) = (SELECT ParseName(@test, 7)) 

select @my1 
select @my2 
select @my3 
select @my4 
select @my5 
select @my6 
select @my7 

結果:

enter image description here

但是,當我改變字符串有另一個值:

DECLARE @value varchar(max) = 'A750!|!none!|!none!|!N!|!Y' 

所有NULL返回:

enter image description here

這究竟是爲什麼,我怎樣才能得到更多的進入分隔值到變量?

回答

1

只是另一種選擇

Declare @value varchar(max) = 'A750!|!none!|!none!|!N' 
Declare @my1 varchar(500) 
Declare @my2 varchar(500) 
Declare @my3 varchar(500) 
Declare @my4 varchar(500) 
Declare @my5 varchar(500) 
Declare @my6 varchar(500) 
Declare @my7 varchar(500) 

Select @my1 = ltrim(rtrim(xDim.value('/x[1]','varchar(max)'))) 
     ,@my2 = ltrim(rtrim(xDim.value('/x[2]','varchar(max)'))) 
     ,@my3 = ltrim(rtrim(xDim.value('/x[3]','varchar(max)'))) 
     ,@my4 = ltrim(rtrim(xDim.value('/x[4]','varchar(max)'))) 
     ,@my5 = ltrim(rtrim(xDim.value('/x[5]','varchar(max)'))) 
     ,@my6 = ltrim(rtrim(xDim.value('/x[6]','varchar(max)'))) 
     ,@my7 = ltrim(rtrim(xDim.value('/x[7]','varchar(max)'))) 
From (Select Cast('<x>' + replace((Select replace(@value,'!|!','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as A 
+0

後續問題http://stackoverflow.com/q/44006270/2333499 – SqlZim

2

Parsename應該用於拆分4部分對象名稱,而不是用於通用字符串拆分 - 如果數據包含.,則腳本將完全中斷。

傑夫MODEN

只需使用一個通用的劃分功能來代替,例如 DelimitedSplit8k
+0

PLUS1 - 我的第一想法也是如此。每個人都應該有一個好的分離器 –