求一数据处理存储过程。

glj_sky 2009-05-08 02:30:35
求大虾帮忙。求一个存储过程
要求根据特定字符把一个表中的一个字段导入到另一个表中的其他字段
例如:

表a
name
00125&&050000&&小明
处理后的表b
name1 name2 name3
00123 050000 小明
...全文
115 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
JonasFeng 2009-05-08
  • 打赏
  • 举报
回复
200万行数据不可能很快的。

就算查出来都很慢。

所以楼主肯定是指定一些条件来筛选。

如果格式固定的话,TONY兄弟的做法不错。

简单,应该是最快的。



JonasFeng 2009-05-08
  • 打赏
  • 举报
回复
 IF OBJECT_id('A') IS NOT NULL
DROP TABLE A

CREATE TABLE A(TNAME VARCHAR(200))
INSERT A(TNAME)
SELECT '00125&&050000&&小明'
UNION ALL
SELECT '00126&&060000&&小李'

----(一步一个脚印)
SELECT MAX(LC.NAME1) AS NAME1, MAX(LC.NAME2) AS NAME2,MAX(LC.NAME3) AS NAME3
FROM
(
SELECT LO.ID / 3 AS MARK ,
(CASE WHEN (LO.ID % 3 = 1) THEN LO.TNAME ELSE '' END) AS NAME2,
(CASE WHEN (LO.ID % 3 = 2) THEN LO.TNAME ELSE '' END) AS NAME3,
(CASE WHEN (LO.ID % 3 = 0) THEN LO.TNAME ELSE '' END) AS NAME1
FROM
(
Select
ROW_NUMBER() OVER(ORDER BY GETDATE()) -1 AS ID, B.TNAME
From
(select TNAME=convert(xml,'<root><v>'+replace(TNAME,'&&','</v><v>')+'</v></root>') from A) T
outer apply
(select TNAME=C.v.value('.','nvarchar(100)') from T.TNAME.nodes('/root/v')C(v) )B
) LO
) LC
GROUP BY LC.MARK


--

00125 050000 小明
00126 060000 小李
ws_hgo 2009-05-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 glj_sky 的回复:]
谢谢各位。
我试了是。不过速度太慢了。运行就卡死了。
可能是我的数据太大了吧。200多万数据。
[/Quote]
create index IX_Name on AA ([name])
ws_hgo 2009-05-08
  • 打赏
  • 举报
回复
Y的
好像整复杂啦
我在想想
有没有更好的办法
ws_hgo 2009-05-08
  • 打赏
  • 举报
回复
select left([name],charindex('&',[name])-1) as name1, left((select substring([name],charindex('&',[name])+2,len([name])-(charindex('&',[name])+2)) from AA),(select
charindex('&',(select substring([name],charindex('&',[name])+2,len([name])-(charindex('&',[name])+2)))) from AA)-1) as name2,reverse(left(reverse([name]),charindex('&',reverse([name]))-1)) as name3 from AA
name1 name2 name3
---------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
00125 050000 小明

(1 行受影响)
ws_hgo 2009-05-08
  • 打赏
  • 举报
回复
create table AA
(
[name] nvarchar(100)
)
insert into AA select '00125&&050000&&小明'
--1
select left([name],charindex('&',[name])-1) as name1 from AA

--2
select left((select substring([name],charindex('&',[name])+2,len([name])-7) from AA),(select
charindex('&',(select substring([name],charindex('&',[name])+2,len([name])-7))) from AA)-1) from AA
--3
select reverse(left(reverse([name]),charindex('&',reverse([name]))-1)) from AA
select left([name],charindex('&',[name])-1) as name1, left((select substring([name],charindex('&',[name])+2,len([name])-7) from AA),(select
charindex('&',(select substring([name],charindex('&',[name])+2,len([name])-7))) from AA)-1) as name2,reverse(left(reverse([name]),charindex('&',reverse([name]))-1)) as name3 from AA
conan304 2009-05-08
  • 打赏
  • 举报
回复
那就过来接分,接分
glj_sky 2009-05-08
  • 打赏
  • 举报
回复
多谢各位了。要是没有更好的解决方法15:30结贴了。来着送分。
glj_sky 2009-05-08
  • 打赏
  • 举报
回复
谢谢各位。
我试了是。不过速度太慢了。运行就卡死了。
可能是我的数据太大了吧。200多万数据。
lg3605119 2009-05-08
  • 打赏
  • 举报
回复

if object_id('tb1') is not null
drop table tb1
go

create table tb1(name varchar(100))
go

insert into tb1 select '00125&&050000&&小明'

if object_id('tb2') is not null
drop table tb2
go

create table tb2(name1 varchar(100),name2 varchar(100),name3 varchar(100))
go

create proc insert_tb1_to_tb2
as
insert into tb2
select substring(replace(name,'&&',','),1,charindex(',',replace(name,'&&',','))-1) as name1,
substring(replace(name,'&&',','),charindex(',',replace(name,'&&',','))+1,charindex(',',replace(name,'&&',','),charindex(',',replace(name,'&&',',')))) as name2,
reverse(substring(replace(reverse(name),'&&',','),1,charindex(',',replace(reverse(name),'&&',','))-1)) as name3
from tb1

-- 调用存储过程
exec insert_tb1_to_tb2


select * from tb2
ks_reny 2009-05-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 htl258 的回复:]
SQL codeif object_id('[a]') is not null drop table [a]
go
create table [a]([name] varchar(30))
insert [a] select '00125&&050000&&小明'

select
parsename(replace(name,'&&','.'),3) name1,
parsename(replace(name,'&&','.'),2) name2,
parsename(replace(name,'&&','.'),1) name3
from a
/*
name1 name2 name3
-------------------------…
[/Quote]
tony兄弟真快.
htl258_Tony 2009-05-08
  • 打赏
  • 举报
回复
导入到另一表B:
表B已存在:
insert b
select
parsename(replace(name,'&&','.'),3) name1,
parsename(replace(name,'&&','.'),2) name2,
parsename(replace(name,'&&','.'),1) name3
from a
表B不存在:
select
into b
parsename(replace(name,'&&','.'),3) name1,
parsename(replace(name,'&&','.'),2) name2,
parsename(replace(name,'&&','.'),1) name3
from a
ks_reny 2009-05-08
  • 打赏
  • 举报
回复
是不是,中間&是成對出現的.
htl258_Tony 2009-05-08
  • 打赏
  • 举报
回复
if object_id('[a]') is not null drop table [a] 
go
create table [a]([name] varchar(30))
insert [a] select '00125&&050000&&小明'

select
parsename(replace(name,'&&','.'),3) name1,
parsename(replace(name,'&&','.'),2) name2,
parsename(replace(name,'&&','.'),1) name3
from a
/*
name1 name2 name3
------------------------------ ------------------------------ ------------------------------
00125 050000 小明

(1 行受影响)
*/
htl258_Tony 2009-05-08
  • 打赏
  • 举报
回复
if object_id('[a]') is not null drop table [a] 
go
create table [a]([name] varchar(30))
insert [a] select '00125&&050000&&小明'

select
left(name,charindex('&',name)-1) name1,
left(right(name,len(name)-charindex('&',name)-1),charindex('&',right(name,len(name)-charindex('&',name)-1))-1) name2,
reverse(left(reverse(name),charindex('&',reverse(name))-1)) name3
from a
/*
name1 name2 name3
------------------------------ ------------------------------ ------------------------------
00125 050000 小明

(1 行受影响)
*/
SQL77 2009-05-08
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20090430/09/8fca9ab8-1cde-4ff5-b64a-63487e6f3df2.html
glj_sky 2009-05-08
  • 打赏
  • 举报
回复
自己顶一下。

34,576

社区成员

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

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