fredrickhu,请进来一下,谢谢

silly_bad 2009-11-10 06:12:04
数据格式如下:

Silly 1,2,3,4 2009-11-10 A,B,C,D

这是需要提交进去的数据格式

存储到数据库里的格式应该是:

Silly 1 2009-11-19 A
Silly 2 2009-11-19 B
Silly 3 2009-11-19 C
Silly 4 2009-11-19 D


刚刚我问了这个问题,谢谢你给我的代码。

我刚刚拿到后做了一下实际应用后发现了一点问题

那就是1,2,3,4这个数据只能是一位长度的值,如果改成不确定长度的,就不行了,只能显示第一行数据,有点苦恼,请问如何解决??

谢谢
...全文
82 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
.
SQL77 2009-11-10
  • 打赏
  • 举报
回复
if object_id('[T]') is not null drop table [T]
go
create table [T]([col1] varchar(5),[col2] varchar(50),[col3] datetime,[col4] varchar(50))
insert [T]
select 'Silly','1,2465,345,4','2009-11-10','A1,BC,C,1D'
--------------开始查询--------------------------

Select ID=IDENTITY(INT,1,1),
a.Col1,COl2=substring(a.Col2,C.number,charindex(',',a.Col2+',',C.number)-C.number),
a.col3 INTO #TA
FROM T A
JOIN master..spt_values C ON C.type='p' and substring(','+a.COl2,C.number,1)=','


Select ID=IDENTITY(INT,1,1),
a.Col1,
a.col3,
col4=substring(a.Col4,B.number,charindex(',',a.Col4+',',B.number)-B.number) INTO #TB
from
T a join master..spt_values b
ON B.type='p' AND substring(','+a.COl4,b.number,1)=','


SELECT A.COL1,A.COL2,A.COL3,B.COL4 FROM #TA A,#TB B WHERE A.ID=B.ID

--DROP TABLE T,#TA,#TB


(所影响的行数为 1 行)


(所影响的行数为 4 行)


(所影响的行数为 4 行)

COL1 COL2 COL3 COL4
----- -------------------------------------------------- ------------------------------------------------------ --------------------------------------------------
Silly 1 2009-11-10 00:00:00.000 A1
Silly 2465 2009-11-10 00:00:00.000 BC
Silly 345 2009-11-10 00:00:00.000 C
Silly 4 2009-11-10 00:00:00.000 1D

(所影响的行数为 4 行)


那个不能用同一NUMBER来拆分
silly_bad 2009-11-10
  • 打赏
  • 举报
回复
谢谢,问题已经解决
SQL77 2009-11-10
  • 打赏
  • 举报
回复
if object_id('[T]') is not null drop table [T]
go
create table [T]([col1] varchar(5),[col2] varchar(50),[col3] datetime,[col4] varchar(50))
insert [T]
select 'Silly','1,2,3,4','2009-11-10','A,BC,C,D'
--------------开始查询--------------------------

Select ID=IDENTITY(INT,1,1),
a.Col1,COl2=substring(a.Col2,C.number,charindex(',',a.Col2+',',C.number)-C.number),
a.col3 INTO #TA
FROM T A
JOIN master..spt_values C ON C.type='p' and substring(','+a.COl2,C.number,1)=','


Select ID=IDENTITY(INT,1,1),
a.Col1,
a.col3,
col4=substring(a.Col4,B.number,charindex(',',a.Col4+',',B.number)-B.number) INTO #TB
from
T a join master..spt_values b
ON B.type='p' AND substring(','+a.COl4,b.number,1)=','


SELECT A.COL1,A.COL2,A.COL3,B.COL4 FROM #TA A,#TB B WHERE A.ID=B.ID

COL1 COL2 COL3 COL4
----- -------------------------------------------------- ------------------------------------------------------ --------------------------------------------------
Silly 1 2009-11-10 00:00:00.000 A
Silly 2 2009-11-10 00:00:00.000 BC
Silly 3 2009-11-10 00:00:00.000 C
Silly 4 2009-11-10 00:00:00.000 D

(所影响的行数为 4 行)
silly_bad 2009-11-10
  • 打赏
  • 举报
回复
数据的长度是不确定的,

可能最后分拆后,有4条,也可能是5条,9条这样的。
xupeihuagudulei 2009-11-10
  • 打赏
  • 举报
回复
信F姐,原地满状态复活。
silly_bad 2009-11-10
  • 打赏
  • 举报
回复
不是不信任,而是正好F姐给的代码直接可以用,我也就没有再去用你的了,现在测试了一下你给的代码,也存在这个问题,分拆后的数据长度只能是1,不能改变

[Quote=引用 7 楼 sql77 的回复:]
引用 4 楼 xupeihuagudulei 的回复:
[Quote=引用   3   楼   sql77   的回复:]
我不是发了那个拆分的方法了么
不信任你
只信F姐
[/Quote]

呵呵,
[/Quote]
bancxc 2009-11-10
  • 打赏
  • 举报
回复
declare @tb table(A nvarchar(10),B nvarchar(10),C nvarchar(10),D nvarchar(10))
insert into @tb
select A='Silly',B='1,2,3,4',C='2009-11-10',D='A,B,C,D'

Select A,B=ParseName(replace(B,',','.'),1),C,D=ParseName(replace(D,',','.'),1)
From @tb T
union all
Select A,B=ParseName(replace(B,',','.'),2) ,C,D=ParseName(replace(D,',','.'),2)
From @tb T
union all
Select A,B=ParseName(replace(B,',','.'),3),C,D=ParseName(replace(D,',','.'),3)
From @tb T
union all
Select A,B=ParseName(replace(B,',','.'),4),C,D=ParseName(replace(D,',','.'),4)
From @tb T
order by B
/*A B C D
---------- -------------------------------------------------------------------------------------------------------------------------------- ---------- --------------------------------------------------------------------------------------------------------------------------------
Silly 1 2009-11-10 A
Silly 2 2009-11-10 B
Silly 3 2009-11-10 C
Silly 4 2009-11-10 D

(4 行受影响)
*/
bancxc 2009-11-10
  • 打赏
  • 举报
回复
这不还是只有四个吗 1,22,3,4432 超过3个逗号吗
SQL77 2009-11-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 silly_bad 的回复:]
不是四位

给一个应该是差不多的范例吧

silly  1,22,3,4432  2009-11-10  a,dcd,fde3f,fdf

数据结果:

silly 1      2009-11-10    a
silly 22    2009-11-10    dcd
silly 3      2009-11-10    fde3f
silly 4432  2009-11-10    fdf

也就是说这需要分拆的数据,每一个长度是不确定的
[/Quote]
小F在第二帖你给50分的那个不是写得很清楚么
silly_bad 2009-11-10
  • 打赏
  • 举报
回复
不是四位

给一个应该是差不多的范例吧

silly 1,22,3,4432 2009-11-10 a,dcd,fde3f,fdf

数据结果:

silly 1 2009-11-10 a
silly 22 2009-11-10 dcd
silly 3 2009-11-10 fde3f
silly 4432 2009-11-10 fdf

也就是说这需要分拆的数据,每一个长度是不确定的
SQL77 2009-11-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xupeihuagudulei 的回复:]
[Quote=引用   3   楼   sql77   的回复:]
我不是发了那个拆分的方法了么
[/Quote]不信任你
只信F姐
[/Quote]

呵呵,
bancxc 2009-11-10
  • 打赏
  • 举报
回复
看看其他人写的可不以咯
xupeihuagudulei 2009-11-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sql77 的回复:]
我不是发了那个拆分的方法了么
[/Quote]不信任你
只信F姐
SQL77 2009-11-10
  • 打赏
  • 举报
回复
if object_id('Tempdb..#Num') is not null
drop table #Num
go
select top 100 ID=Identity(int,1,1) into #Num from syscolumns a,syscolumns b
Select
a.Col1,COl2=substring(a.Col2,b.ID,charindex(',',a.Col2+',',b.ID)-b.ID)
from
Tab a,#Num b
where
charindex(',',','+a.Col2,b.ID)=b.ID --也可用 substring(','+a.COl2,b.ID,1)=','

方法
SQL77 2009-11-10
  • 打赏
  • 举报
回复
我不是发了那个拆分的方法了么
SQL77 2009-11-10
  • 打赏
  • 举报
回复
只有四位好说PARSENAME
bancxc 2009-11-10
  • 打赏
  • 举报
回复
A,B,C,D
只有4位吗

34,588

社区成员

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

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