在SQL中如何把一列字符串拆分为多列,请高手赐教

lxlsx 2015-02-03 09:20:38
是这样的,我有一串很长的数字串,
如:12345678901234567890
12345678901234567890
如何把他们分成20列,每列只有一个数字?
就像这样:
1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
...全文
2523 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxlsx 2015-02-05
  • 打赏
  • 举报
回复
引用 10 楼 ap0405140 的回复:
[quote=引用 7 楼 lxlsx 的回复:] 这是我的代码,原数据一行120个数字我查的很清楚了,就是报错:列名或所提供值的数目与表定义不匹配。
引用 8 楼 lxlsx 的回复:
并且在数据库中找不到新建成的表#t以及表#1123
看代码没什么问题,建议: 1.将declare @i tinyint,@str0 varchar(500),@tsql varchar(600) 修改为 declare @i int,@str0 varchar(6000),@tsql varchar(6000) 试试. 2.检查[铜川成绩$]表dt列的数据是否正常. 再不行可以私信找我,远程帮你看看.. [/quote] 谢版主大大,已经搞定。
唐诗三百首 2015-02-05
  • 打赏
  • 举报
回复
引用 7 楼 lxlsx 的回复:
这是我的代码,原数据一行120个数字我查的很清楚了,就是报错:列名或所提供值的数目与表定义不匹配。
引用 8 楼 lxlsx 的回复:
并且在数据库中找不到新建成的表#t以及表#1123
看代码没什么问题,建议: 1.将declare @i tinyint,@str0 varchar(500),@tsql varchar(600) 修改为 declare @i int,@str0 varchar(6000),@tsql varchar(6000) 试试. 2.检查[铜川成绩$]表dt列的数据是否正常. 再不行可以私信找我,远程帮你看看..
Ekun_sky 2015-02-04
  • 打赏
  • 举报
回复
use master
go
if OBJECT_ID('a') is not null  drop table a
go
create table a(tr varchar(50))
go
insert into a
              select '12345678901234567890' union all
              select '0123'                 union all
              select '98765432101234567890'
go

declare @i int,@j int,@sql varchar(5000),@sqt varchar(8000)
select @i=MAX(len(tr))  from a    
set @j=1
set @sql=''
set @sqt=''
while @j<=@i
begin
select @sql=@sql +',[str'+ltrim(@j)+']'
set @j=@j+1
end       

set @sqt='select *  from 

(select tr,SUBSTRING(tr,number+1,1) as nums,''str''+LTRIM(number+1) as col

from a,master..spt_values as b where LEN(tr)>b.number and b.type=''p'' ) as c

pivot (max(nums) for col in ('+substring(@sql,2,999)+')) as d'  

exec(@sqt)
           
Neo_whl 2015-02-04
  • 打赏
  • 举报
回复
引用
并且在数据库中找不到新建成的表#t以及表#1123
这些都在系统数据库tempdb中
lxlsx 2015-02-04
  • 打赏
  • 举报
回复
并且在数据库中找不到新建成的表#t以及表#1123
lxlsx 2015-02-04
  • 打赏
  • 举报
回复
use test1 --建表代码 create table #1123 ([1] char(1),[2] char(1),[3] char(1),[4] char(1),[5] char(1),[6] char(1),[7] char(1),[8] char(1),[9] char(1),[10] char(1), [11] char(1),[12] char(1),[13] char(1),[14] char(1),[15] char(1),[16] char(1),[17] char(1),[18] char(1),[19] char(1),[20] char(1), [21] char(1),[22] char(1),[23] char(1),[24] char(1),[25] char(1),[26] char(1),[27] char(1),[28] char(1),[29] char(1),[30] char(1), [31] char(1),[32] char(1),[33] char(1),[34] char(1),[35] char(1),[36] char(1),[37] char(1),[38] char(1),[39] char(1),[40] char(1), [41] char(1),[42] char(1),[43] char(1),[44] char(1),[45] char(1),[46] char(1),[47] char(1),[48] char(1),[49] char(1),[50] char(1), [51] char(1),[52] char(1),[53] char(1),[54] char(1),[55] char(1),[56] char(1),[57] char(1),[58] char(1),[59] char(1),[60] char(1), [61] char(1),[62] char(1),[63] char(1),[64] char(1),[65] char(1),[66] char(1),[67] char(1),[68] char(1),[69] char(1),[70] char(1), [71] char(1),[72] char(1),[73] char(1),[74] char(1),[75] char(1),[76] char(1),[77] char(1),[78] char(1),[79] char(1),[80] char(1), [81] char(1),[82] char(1),[83] char(1),[84] char(1),[85] char(1),[86] char(1),[87] char(1),[88] char(1),[89] char(1),[90] char(1), [91] char(1),[92] char(1),[93] char(1),[94] char(1),[95] char(1),[96] char(1),[97] char(1),[98] char(1),[99] char(1),[100] char(1), [101] char(1),[102] char(1),[103] char(1),[104] char(1),[105] char(1),[106] char(1),[107] char(1),[108] char(1),[109] char(1),[110] char(1), [111] char(1),[112] char(1),[113] char(1),[114] char(1),[115] char(1),[116] char(1),[117] char(1),[118] char(1),[119] char(1),[120] char(1),) --分列代码 declare @i tinyint,@str0 varchar(500),@tsql varchar(600) declare ap scroll cursor for select dt from 铜川成绩$ open ap fetch first from ap into @str0 while(@@FETCH_STATUS<>-1) begin select @i=1,@tsql=null while(@i<=120) begin select @tsql=ISNULL(@tsql+',','select ')+''''+SUBSTRING(@str0,@i,1)+''' ' select @i=@i+1 end insert into #1123 exec(@tsql) fetch next from ap into @str0 end close ap deallocate ap 这是我的代码,原数据一行120个数字我查的很清楚了,就是报错:列名或所提供值的数目与表定义不匹配。
lxlsx 2015-02-04
  • 打赏
  • 举报
回复
引用 2 楼 ap0405140 的回复:

create table sx(str0 varchar(50))

insert into sx(str0)
 select '12345678901234567890' union all
 select '12345678901234567890'


-- 建结果表#t
create table #t
(str1 char(1),str2 char(1),str3 char(1),str4 char(1),str5 char(1),
 str6 char(1),str7 char(1),str8 char(1),str9 char(1),str10 char(1),
 str11 char(1),str12 char(1),str13 char(1),str14 char(1),str15 char(1),
 str16 char(1),str17 char(1),str18 char(1),str19 char(1),str20 char(1))


-- 分成20列,写入结果表#t
declare @i tinyint,@str0 varchar(50),@tsql varchar(600)
declare ap scroll cursor for select str0 from sx

open ap
fetch first from ap into @str0
while(@@fetch_status<>-1)
begin
 select @i=1,@tsql=null
 while(@i<=20)
 begin
  select @tsql=isnull(@tsql+',','select ')+''''+substring(@str0,@i,1)+''' '
  select @i=@i+1
 end

 insert into #t exec(@tsql)
 fetch next from ap into @str0
end

close ap
deallocate ap


-- 结果
select * from #t
/*
str1 str2 str3 str4 str5 str6 str7 str8 str9 str10 str11 str12 str13 str14 str15 str16 str17 str18 str19 str20
---- ---- ---- ---- ---- ---- ---- ---- ---- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----
1    2    3    4    5    6    7    8    9    0     1     2     3     4     5     6     7     8     9     0
1    2    3    4    5    6    7    8    9    0     1     2     3     4     5     6     7     8     9     0

(2 row(s) affected)
*/
报这个错误:列名或所提供值的数目与表定义不匹配。
zebro1573 2015-02-04
  • 打赏
  • 举报
回复
都是 标准答案 了。。。。[/quote]
haitao 2015-02-04
  • 打赏
  • 举报
回复
都是 标准答案 了。。。。
唐诗三百首 2015-02-03
  • 打赏
  • 举报
回复

create table sx(str0 varchar(50))

insert into sx(str0)
 select '12345678901234567890' union all
 select '12345678901234567890'


-- 建结果表#t
create table #t
(str1 char(1),str2 char(1),str3 char(1),str4 char(1),str5 char(1),
 str6 char(1),str7 char(1),str8 char(1),str9 char(1),str10 char(1),
 str11 char(1),str12 char(1),str13 char(1),str14 char(1),str15 char(1),
 str16 char(1),str17 char(1),str18 char(1),str19 char(1),str20 char(1))


-- 分成20列,写入结果表#t
declare @i tinyint,@str0 varchar(50),@tsql varchar(600)
declare ap scroll cursor for select str0 from sx

open ap
fetch first from ap into @str0
while(@@fetch_status<>-1)
begin
 select @i=1,@tsql=null
 while(@i<=20)
 begin
  select @tsql=isnull(@tsql+',','select ')+''''+substring(@str0,@i,1)+''' '
  select @i=@i+1
 end

 insert into #t exec(@tsql)
 fetch next from ap into @str0
end

close ap
deallocate ap


-- 结果
select * from #t
/*
str1 str2 str3 str4 str5 str6 str7 str8 str9 str10 str11 str12 str13 str14 str15 str16 str17 str18 str19 str20
---- ---- ---- ---- ---- ---- ---- ---- ---- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----
1    2    3    4    5    6    7    8    9    0     1     2     3     4     5     6     7     8     9     0
1    2    3    4    5    6    7    8    9    0     1     2     3     4     5     6     7     8     9     0

(2 row(s) affected)
*/
还在加载中灬 2015-02-03
  • 打赏
  • 举报
回复
--动态处理的方法
DECLARE @ColumnNum INT
SET @ColumnNum=20

DECLARE @SQL VARCHAR(8000)
SET @SQL=''
DECLARE @COUNT VARCHAR(10)
SET @COUNT=1
WHILE @COUNT<=@ColumnNum
SELECT @SQL=@SQL+',SUBSTRING(列名,'+@COUNT+',1)['+@COUNT+']'
	,@COUNT=@COUNT+1
SET @SQL='SELECT '+STUFF(@SQL,1,1,'')+'FROM 表名'
--PRINT @SQL
EXEC(@SQL)

--写名的方法
SELECT SUBSTRING(列名,1,1)[1]
	,SUBSTRING(列名,2,1)[2]
	,SUBSTRING(列名,3,1)[3]
	,SUBSTRING(列名,4,1)[4]
	,SUBSTRING(列名,5,1)[5]
	,SUBSTRING(列名,6,1)[6]
	,SUBSTRING(列名,7,1)[7]
	,SUBSTRING(列名,8,1)[8]
	,SUBSTRING(列名,9,1)[9]
	,SUBSTRING(列名,10,1)[10]
	,SUBSTRING(列名,11,1)[11]
	,SUBSTRING(列名,12,1)[12]
	,SUBSTRING(列名,13,1)[13]
	,SUBSTRING(列名,14,1)[14]
	,SUBSTRING(列名,15,1)[15]
	,SUBSTRING(列名,16,1)[16]
	,SUBSTRING(列名,17,1)[17]
	,SUBSTRING(列名,18,1)[18]
	,SUBSTRING(列名,19,1)[19]
	,SUBSTRING(列名,20,1)[20]
FROM 表名

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧