转一个经典问题,似乎在一些情况下可以代替循环

表table结构如下,有多条记录, beginnum 与endnum的值分别代表起始和终止值,我现在想把此表中所有记录的beginnum 与endnum中间的值分别插入到一个表中,有什么性能高的方法么?我用游标遍历table,然后再用while开insert into,速度超慢..求性能高的方法,谢谢大家

beginnum  endnum

112345    113345
248175    248317

-------答案:

set rowcount 10000
select identity(int,0,1) as id into # from sysobjects a,syscolumns b --这句用研究一下
set rowcount 0

insert into 表2
select (a.beginnum+b.id) from 表1 a,# b where a.beginnum+b.id<=b.endnum --这句也要研究一下

drop table #

---------------------------------------------------------类似的问题------------------------------------------------------

   --将表某个字符串拆分生成多行数据

--创建测试
create table TableA (col1 varchar(10),col2 varchar(100))
insert into TableA
select 'abc','111,222,333' union all
select 'bcd','222,333'
 
--想生成这样
/*
col1     col2
abc      111
abc      222
abc      333
bcd      222
bcd      333
*/
---------------------
--测试方法
SELECT TOP 4000
id = identity(int,1,1)
INTO #Temp
FROM syscolumns a, syscolumns b --这里什么意思?
 
SELECT A.col1, col2 = SUBSTRING(A.col2, B.ID, CHARINDEX(',', A.col2 + ',', B.ID) - B.ID)
FROM TableA A, #Temp B
WHERE SUBSTRING(',' + a.col2, B.id, 1) = ',' --此方法好
order by col1
--测试结果
/*
col1 col2
abc 111
abc 222
abc 333
bcd 222
bcd 333
*/
--删除测试环境
drop table #Temp
drop table TableA


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值