改了函数,使用varchar(max),应该够了:
CREATE TABLE [dbo].[test](
[Author] [nvarchar](500) NULL,
[count] [int] NULL,
[hits] [int] NULL,
[Py] [nvarchar](30) NULL
) ON [PRIMARY]
GO
insert Into test
select '白晨,彭杰,李金兵',1,0,'b,p,l'
go
--1.拆分函数
if exists(select * from sys.objects where name = 'f_splitSTR' and type = 'tf')
drop function dbo.f_splitSTR
go
create function dbo.f_splitSTR
(
@s1 varchar(max), --要分拆的字符串
@s2 varchar(max),
@split varchar(10) --分隔字符
)
returns @re table( --要返回的临时表
col_1 varchar(1000), --临时表中的列
col_2 varchar(1000)
)
as
begin
declare @len int
set @len = LEN(@split) --分隔符不一定就是一个字符,可能是2个字符
while CHARINDEX(@split,@s1) >0 or CHARINDEX(@split,@s2)>0
begin
insert into @re
values(left(@s1,charindex(@split,@s1) - 1),
left(@s2,charindex(@split,@s2) - 1))
set @s1 = STUFF(@s1,1,charindex(@split,@s1) - 1 + @len ,'') --覆盖:字符串以及分隔符
set @s2 = STUFF(@s2,1,charindex(@split,@s2) - 1 + @len ,'') --覆盖:字符串以及分隔符
end
insert into @re values(@s1,@s2)
return --返回临时表
end
go
select --Author,
col_1 as author,
count(*) over(partition by Author) as count,
hits,
col_2 as py
from test
cross apply dbo.f_splitSTR(replace([Author],',',','),[Py],',')
/*
authorcounthitspy
白晨30b
彭杰30p
李金兵30l
*/