Kyl*_*ard 6 sql sql-server-2005
我的谷歌搜索如何在分隔符上拆分字符串已经导致一些有用的功能,用于在字符串已知时分割字符串(即见下文):
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER 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
Run Code Online (Sandbox Code Playgroud)
这适用于已知的字符串,如:
SELECT TOP 10 * FROM dbo.Split('This,Is,My,List',',')
Run Code Online (Sandbox Code Playgroud)
但是,我想将一个列传递给一个函数,并将它与我自己行中的其他数据联合在一起...例如,给定数据:
CommaColumn ValueColumn1 ValueColumn2
----------- ------------ -------------
ABC,123 1 2
XYZ, 789 2 3
Run Code Online (Sandbox Code Playgroud)
我想写一些类似的东西:
SELECT Split(CommaColumn,',') As SplitValue, ValueColumn1, ValueColumn2 FROM MyTable
Run Code Online (Sandbox Code Playgroud)
然后回来
SplitValue ValueColumn1 ValueColumn2
---------- ------------ ------------
ABC 1 2
123 1 2
XYZ 2 3
789 2 3
Run Code Online (Sandbox Code Playgroud)
这可能,或者之前有人这样做过吗?
Pet*_*hia 13
是的,可以使用CROSS APPLY(SQL 2005+):
with testdata (CommaColumn, ValueColumn1, ValueColumn2) as (
select 'ABC,123', 1, 2 union all
select 'XYZ, 789', 2, 3
)
select
b.items as SplitValue
, a.ValueColumn1
, a.ValueColumn2
from testdata a
cross apply dbo.Split(a.CommaColumn,',') b
Run Code Online (Sandbox Code Playgroud)
笔记:
您应该为拆分列的结果集添加索引,以便它返回两列,IndexNumber和Value.
使用数字表的内联实现通常比此处的过程版本更快.
例如:
create function [dbo].[Split] (@list nvarchar(max), @delimiter nchar(1) = N',')
returns table
as
return (
select
Number = row_number() over (order by Number)
, [Value] = ltrim(rtrim(convert(nvarchar(4000),
substring(@list, Number
, charindex(@delimiter, @list+@delimiter, Number)-Number
)
)))
from dbo.Numbers
where Number <= convert(int, len(@list))
and substring(@delimiter + @list, Number, 1) = @delimiter
)
Run Code Online (Sandbox Code Playgroud)
Erland Sommarskog有关于此的最终页面,我认为:http://www.sommarskog.se/arrays-in-sql-2005.html