Sql server 在SQLServer2005中将字符串拆分为三个变量

Sql server 在SQLServer2005中将字符串拆分为三个变量,sql-server,Sql Server,我有一根绳子 declare @s varchar(100), set @s='aaaa,bbbb,cccc' declare @first varchar(100), declare @second varchar(100), declare @third varchar(100) 现在我需要将这些字符串拆分为三个变量,其中包含如下值 @first=aaaa @second=bbbb @third=cccc aaaa bbbb cccc 如果我使用split函数,那么我得到如下输出 @

我有一根绳子

declare @s varchar(100),
set @s='aaaa,bbbb,cccc'

declare @first varchar(100),
declare @second varchar(100),
declare @third varchar(100)
现在我需要将这些字符串拆分为三个变量,其中包含如下值

@first=aaaa
@second=bbbb
@third=cccc
aaaa
bbbb
cccc
如果我使用split函数,那么我得到如下输出

@first=aaaa
@second=bbbb
@third=cccc
aaaa
bbbb
cccc
有没有更好的方法可以达到这个结果?任何帮助都将不胜感激

我希望这个结果成为一个变量,因为我需要它进行进一步的处理


谢谢

假设您的输入字符串始终遵循该格式,这里有一个快速而肮脏的破解

DECLARE @s VARCHAR(100)
SET @s = 'aaaa,bbbb,cccc'


DECLARE @first VARCHAR(100)
DECLARE @second VARCHAR(100)
DECLARE @third VARCHAR(100) 

SET @s = '<row>' + REPLACE(@s, ',', '</row><row>') + '</row>'

SELECT  @first = CONVERT(XML, @s).value('(/row)[1]', 'varchar(100)')
      , @second = CONVERT(XML, @s).value('(/row)[2]', 'varchar(100)')
      , @third = CONVERT(XML, @s).value('(/row)[3]', 'varchar(100)')
SELECT  @first
      , @second
      , @third
DECLARE@s VARCHAR(100)
SET@s='aaaa、bbbb、cccc'
声明@first VARCHAR(100)
声明@second VARCHAR(100)
声明@third VARCHAR(100)
设置@s=''+替换(@s','','')+''
选择@first=CONVERT(XML,@s).value(“(/row)[1]”,以及“varchar(100)”)
,@second=CONVERT(XML,@s).value(“(/row)[2]”,“/varchar(100)”)
,@third=CONVERT(XML,@s).value(“(/row)[3]”,“/varchar(100)”)
选择@first
秒
第三

这里有一个快速而肮脏的破解,假设您的输入字符串始终遵循该格式

DECLARE @s VARCHAR(100)
SET @s = 'aaaa,bbbb,cccc'


DECLARE @first VARCHAR(100)
DECLARE @second VARCHAR(100)
DECLARE @third VARCHAR(100) 

SET @s = '<row>' + REPLACE(@s, ',', '</row><row>') + '</row>'

SELECT  @first = CONVERT(XML, @s).value('(/row)[1]', 'varchar(100)')
      , @second = CONVERT(XML, @s).value('(/row)[2]', 'varchar(100)')
      , @third = CONVERT(XML, @s).value('(/row)[3]', 'varchar(100)')
SELECT  @first
      , @second
      , @third
DECLARE@s VARCHAR(100)
SET@s='aaaa、bbbb、cccc'
声明@first VARCHAR(100)
声明@second VARCHAR(100)
声明@third VARCHAR(100)
设置@s=''+替换(@s','','')+''
选择@first=CONVERT(XML,@s).value(“(/row)[1]”,以及“varchar(100)”)
,@second=CONVERT(XML,@s).value(“(/row)[2]”,“/varchar(100)”)
,@third=CONVERT(XML,@s).value(“(/row)[3]”,“/varchar(100)”)
选择@first
秒
第三

如果您正在使用的拆分函数返回表中的三个值,一个选项可能是使用该输出插入具有整数标识的表变量,然后选择哪个变量与哪个标识值配对:

DECLARE @first VARCHAR(100)
DECLARE @second VARCHAR(100)
DECLARE @third VARCHAR(100) 

declare @split_output table (block varchar(100) )

declare @split_identity table (in_order int identity(1,1), block varchar(100))


/* recreate output of split fn */
insert into @split_output
select 'aaaa'
union
select 'bbbb'
union
select 'cccc'

select * from @split_output


/* push split output into table with identity column */
insert into @split_identity (block)
select block from @split_output

select * from @split_identity


/* Use identity value to pick which row of the table goes with which variable */
set @first = (select block from @split_identity where in_order = 1)
set @second = (select block from @split_identity where in_order = 2)
set @third  = (select block from @split_identity where in_order = 3)

select @first, @second, @third

如果您正在使用的split函数返回表中的三个值,一个选项可能是使用该输出插入具有整数标识的表变量,然后选择具有哪个标识值的变量对:

DECLARE @first VARCHAR(100)
DECLARE @second VARCHAR(100)
DECLARE @third VARCHAR(100) 

declare @split_output table (block varchar(100) )

declare @split_identity table (in_order int identity(1,1), block varchar(100))


/* recreate output of split fn */
insert into @split_output
select 'aaaa'
union
select 'bbbb'
union
select 'cccc'

select * from @split_output


/* push split output into table with identity column */
insert into @split_identity (block)
select block from @split_output

select * from @split_identity


/* Use identity value to pick which row of the table goes with which variable */
set @first = (select block from @split_identity where in_order = 1)
set @second = (select block from @split_identity where in_order = 2)
set @third  = (select block from @split_identity where in_order = 3)

select @first, @second, @third


可能有帮助可能有帮助只要字符串不包含任何
&
就可以正常工作只要字符串不包含任何
&