读书人

着急用sql操作拆分字段内容

发布时间: 2014-01-13 17:16:02 作者: rapoo

在线等,着急用,sql操作拆分字段内容
原始表如下图
,着急用,sql操作拆分字段内容
通过sql语句或试图都可以,拆分成如图
,着急用,sql操作拆分字段内容
就是把名字和首字母都拆成没行只有一个名字,上图还少了个功能,就是count值为如果两个名字拆分两条每条的count值要加起来,大概就是这个意思了,希望高手指教,要详细的,创建表语句
CREATE TABLE [dbo].[test](
[Author] [nvarchar](500) NULL,
[count] [int] NULL,
[hits] [int] NULL,
[Py] [nvarchar](30) NULL
) ON [PRIMARY]

GO
数据自己插两条吧
[解决办法]

引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

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(8000), --要分拆的字符串
@s2 varchar(8000),
@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
*/


我试了下可以,但是若是表里数据有200条,我查下就显示了91条,报
消息 537,级别 16,状态 2,第 1 行
传递给 LEFT 或 SUBSTRING 函数的长度参数无效。
语句已终止。
这是什么原因呢?好像这个@s1 varchar(8000)不能用text类型,但是8000字符对我来说不够


改了函数,使用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
*/


还是不行,因为varchar的最大值就是8000,我的表中数据比较多,都超过8000了,有没有其它方式解决呢?


都中文字咯

读书人网 >SQL Server

热点推荐