我得到了这个函数来分割字符串,但是它将spited字符串放在我想要的一列中,如下所示。
如何修改函数以获得如下所示的输出。
我在google上找到了这个功能。
CREATE FUNCTION dbo.Split(@String varchar(8000), @Delimiter char(1))
returns @temptable TABLE (items varchar(8000))
as
begin
declare @idx int
declare @slice varchar(8000)
select @idx = 1
if len(@String)<1 or @String is null return
while @idx!= 0
begin
set @idx = charindex(@Delimiter,@String)
if @idx!=0
set @slice = left(@String,@idx - 1)
else
set @slice = @String
if(len(@slice)>0)
insert into @temptable(Items) values(@slice)
set @String = right(@String,len(@String) - @idx)
if len(@String) = 0 break
end
return
end
SELECT * from dbo.Split('hello hi guys',' ');
items
--------
hello
hi
guys
I want like this
col1 col2 col3
_____ _______ _______
hello hi guys
答案 0 :(得分:2)
如果您可以保证不会将任何XML字符传递到@String
,请尝试以下操作...
更新以对XML字符“更安全”(尽管如果包含]]>
它仍会失败...
CREATE FUNCTION dbo.Split(@String varchar(8000), @Delimiter char(1))
returns @temptable TABLE (col1 varchar(8000), col2 varchar(8000), col3 varchar(8000))
as
begin
declare @xml xml
set @xml = '<data><col><![CDATA[' +
replace(@String,@Delimiter,']]></col><col><![CDATA[') +
']]></col></data>'
insert into @temptable (col1, col2, col3)
select parts.value('col[1]','varchar(8000)'),
parts.value('col[2]','varchar(8000)'),
parts.value('col[3]','varchar(8000)')
from @xml.nodes('/data') as parts(parts)
return
end