我正试图打破一个字符串进入'!|!':
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
结果:
但是当我将字符串更改为另一个值时:
DECLARE @value varchar(max) = 'A750!|!none!|!none!|!N!|!Y'
所有NULL返回:
为什么会发生这种情况?如何将更多传入的分隔值转换为变量?
答案 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