增加稀释的字符串无法正确解析

时间:2017-05-14 17:47:36

标签: sql sql-server tsql

我正试图打破一个字符串进入'!|!':

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

为什么会发生这种情况?如何将更多传入的分隔值转换为变量?

2 个答案:

答案 0 :(得分:2)

Parsename应该用于拆分4部分对象名称,而不是用于通用字符串拆分 - 如果数据包含.,您的脚本将完全中断。

只需使用通用拆分功能,例如Jeff Moden的DelimitedSplit8k

答案 1 :(得分: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