先说情况:
一个名叫的User表,其中有字段
uId 主键ID
Username 用户名
RegDate 注册时间
这三个字段。里面有10万条记录。现在,我想把10万记录,从2010-1-1到今天,以天数为最大循环单位,
把10万记录条数的RegDate(注册时间) update到今天。每天递增。
意思就是说,
例如:
时间为2010-1-1 update 3条记录
时间为2010-1-2 update 5条记录
时间为2010-1-3 update 7条记录
。。
今天2011-10-18 update 2000条记录(今天刚好把剩下的update完)这是工作中遇见的情况,实在搞不掂。
特请大侠们帮我出一个脚本或存储过程,如不明白我会再说明白,先拜托各位了。
一个名叫的User表,其中有字段
uId 主键ID
Username 用户名
RegDate 注册时间
这三个字段。里面有10万条记录。现在,我想把10万记录,从2010-1-1到今天,以天数为最大循环单位,
把10万记录条数的RegDate(注册时间) update到今天。每天递增。
意思就是说,
例如:
时间为2010-1-1 update 3条记录
时间为2010-1-2 update 5条记录
时间为2010-1-3 update 7条记录
。。
今天2011-10-18 update 2000条记录(今天刚好把剩下的update完)这是工作中遇见的情况,实在搞不掂。
特请大侠们帮我出一个脚本或存储过程,如不明白我会再说明白,先拜托各位了。
解决方案 »
- SQL表中添加记录后,播放系统声音?
- 按部门名称查询出人工的人数大于等于100(表 emp_employee 部门名称:department,员工姓名:chnalias)
- SQL动态查询字段输出页数
- 请教一个mssql导出数据的问题
- 将表的记录插入另一个表中
- 关于分组的语句如何写
- 求 sql 从某一字符开始的类似隔行查询
- select * from order 选择几百条记录要10几秒,
- sp_executesql 语句的问题
- 请教:关于ERP后台SQL服务的问题。
- win7里面,读取并显示sql图片问题
- 链接服务器 "(null)" 的 OLE DB 访问接口 "Microsoft.Jet.OLEDB.4.0" 不包含表 "xactions"。该表不存在,或者当前用户没有访问该表的权限。
set @dt='2010-1-1'
set @i=1
set @dt2=convert(varchar(10),getdate(),120)
while @dt<=dt2
begin
set rowcount @i
update [user] set Username=Username where convert(varchar(10),RegDate,120)=@dt
select @dt=@dt+1,@i=@i+2end
set rowcount 0
问题主要是那个递增,递增数可以固定,也可以不固定。
递增数随便用一个的话,会出现要么N天前就update完了,要么最后一天时,还有大把记录。变成最后一天爆增,
set @dt='2010-1-1'
select @i=1,@con=0
set @dt2=convert(varchar(10),getdate(),120)
while @dt<=@dt2 and @con<2000
begin
if @dt=@dt2
select @i=2000-@con
set rowcount @i
update [user] set Username=Username where convert(varchar(10),RegDate,120)=@dt
set @con=@con+@@ROWCOUNT
select @dt=@dt+1,@i=@i+2
end
set rowcount 0这里写了一个算法,如果2000条到今天还没有更新时,今天更新记录=2000-前面更新记录
不过有一点,我需要update的是那个注册时间RegDate
update [user] set RegDate=??? where .........简化一下情况吧。
假如:User表有15条记录,注册时间RegDate列全是2000-1-1,我要修改里面的注册时间RegDate字段。
起始时间从2011-10-15处工起,假如今天的时间是2011-10-18,修改后结果是:
Username RegDate
A1 2011-10-15
A2 2011-10-15 A3 2011-10-16
A4 2011-10-16
A5 2011-10-16 A6 2011-10-17
A7 2011-10-17
A8 2011-10-17
A9 2011-10-17 A10 2011-10-18
A11 2011-10-18
A12 2011-10-18
A13 2011-10-18
A14 2011-10-18
A15 2011-10-18最后多出的一些数全部update成最后一天。
递增是奇数
set nocount on;if OBJECT_ID('User') is not null
drop table [User]
go
Create table [User]
(
uId int identity,
Username nvarchar(50),
RegDate datetime default('2010-1-1')
)
go
insert [User](UserName) values('A')
go 15go
update [User] set UserName=UserName+RTRIM(Uid)
go
declare @dt datetime,@dt2 datetime,@i int,@con int,@j int,@maxcon int
set @dt='2011-10-15'
set @maxcon=15
select @i=1,@con=0,@j=1
set @dt2='2011-10-18'
while @con<@maxcon--更新15条记录为例
begin
set @j=@i*2-1
if @dt=@dt2
set @j=@maxcon-@con
update top(@j) [User] set RegDate=@dt where RegDate='2010-01-01'
select @con=@con+@@ROWCOUNT,@dt=@dt+1,@i=@i+1
endgo
select * from [User]
/*
uId Username RegDate
1 A1 2011-10-15 00:00:00.000
2 A2 2011-10-16 00:00:00.000
3 A3 2011-10-16 00:00:00.000
4 A4 2011-10-16 00:00:00.000
5 A5 2011-10-17 00:00:00.000
6 A6 2011-10-17 00:00:00.000
7 A7 2011-10-17 00:00:00.000
8 A8 2011-10-17 00:00:00.000
9 A9 2011-10-17 00:00:00.000
10 A10 2011-10-18 00:00:00.000
11 A11 2011-10-18 00:00:00.000
12 A12 2011-10-18 00:00:00.000
13 A13 2011-10-18 00:00:00.000
14 A14 2011-10-18 00:00:00.000
15 A15 2011-10-18 00:00:00.000
*/
(
uId int identity,
Username nvarchar(50),
RegDate datetime default('2010-1-1')
)
go
insert [User](UserName) values('A')
go 20update [User] set UserName=UserName+RTRIM(Uid)
select * from [User]
truncate table [user]declare @dt datetime,@n int, @i int
set @dt='2011-01-01'
select @n=3,@i=2
while exists(select 1 from [user] where uId=@i)
begin
update top(@n) [User] set RegDate=@dt where RegDate='2010-01-01'
set @dt=@dt+1
set @i=@i+1
set @n=@i*2-1
end