日期:2014-05-18  浏览次数:20628 次

这个问题该如何实现?
有一张简单的人名表user,现在要求每个月的1号自动在另外一张表month_user(month,username)中生成该月月份以及相应的来自人名表中的姓名.
如user表中的列名为username
数据为:
张三
李四
王五
钱六
赵七


假如2007年1月1日自动在month_user表中生成
200701  张三
则2007年2月1日自动在month_user表中生成
200702  李四
。。。。
则2007年5月1日自动在month_user表中生成
200705  赵七
到了2007年6月1日自动在month_user表中生成
200706  张三
(也就是说到了user表的末尾后会自动循环表中记录,从头开始。)

------解决方案--------------------
--这是把截止日期算到2010年的.
create table [user](id int,username varchar(10))
insert into [user] values(1, '张三')
insert into [user] values(2, '李四')
insert into [user] values(3, '王五')
insert into [user] values(4, '钱六')
insert into [user] values(5, '赵七')
go
select top 100 id=identity( int,0,1) into tmp from syscolumns a,syscolumns b

select convert(varchar(7),dateadd(month,tmp.id ,cast('2007-01-01' as datetime)),120) 月份, [user].username 
from [user],tmp
where datediff(month,dateadd(month,tmp.id ,cast('2007-01-01' as datetime)) , cast('2010-01-01' as datetime)) >= 0 and 
tmp.id%5 = [user].id - 1
order by 月份
drop table [user],tmp

/*
月份 username
------- ---------- 
2007-01 张三
2007-02 李四
2007-03 王五
2007-04 钱六
2007-05 赵七
2007-06 张三
2007-07 李四
2007-08 王五
2007-09 钱六
2007-10 赵七
2007-11 张三
2007-12 李四
2008-01 王五
2008-02 钱六
2008-03 赵七
2008-04 张三
2008-05 李四
2008-06 王五
2008-07 钱六
2008-08 赵七
2008-09 张三
2008-10 李四
2008-11 王五
2008-12 钱六
2009-01 赵七
2009-02 张三
2009-03 李四
2009-04 王五
2009-05 钱六
2009-06 赵七
2009-07 张三
2009-08 李四
2009-09 王五
2009-10 钱六
2009-11 赵七
2009-12 张三
2010-01 李四

(所影响的行数为 37 行)
*/
------解决方案--------------------
下例为转帖,看对你有没有用?
使用作业定时启停数据库的示例

IF EXISTS(SELECT * FROM msdb.dbo.sysjobs WHERE name='启用pubs数据库')
EXEC msdb.dbo.sp_delete_job @job_name='启用pubs数据库'

--定义创建作业
DECLARE @jobid uniqueidentifier
EXEC msdb.dbo.sp_add_job
@job_name = N'启用pubs数据库',
@job_id = @jobid OUTPUT

--定义作业步骤
DECLARE @sql nvarchar(400),@dbname sysname
SELECT @dbname=N'master', --数据库联机或者脱机只能在master数据库中进行
@sql=N'ALTER DATABASE pubs SET ONLINE' --使用pubs数据库联机(启用)
EXEC msdb.dbo.sp_add_jobstep
@job_id = @jobid,
@step_name = N'启用pubs数据库处理',
@subsystem = 'TSQL',
@database_name=@dbname,
@command = @sql

--创建调度(使用后面专门定义的几种作业调度模板)
EXEC msdb..sp_add_jobschedule
@job_id = @jobid,
@name = N'启用pubs数据库处理调度',
@freq_type=4,
@freq_interval=1,
@freq_subday_type=0x1,
@freq_subday_interval=1,
@active_start_time = 075000 --每天07:50分执行

--添加目标服务器
DECLARE @servername sysname
SET @servername=CONVERT(nvarchar(128),SERVERPROPERTY(N'ServerName'))
EXEC msdb.dbo.sp_add_jobserver 
@job_id = @jobid,
@server_name = @servername

------解决方案--------------------
--可以用触发器
create table [user](username nvarchar(10))
go
create table month_user([month] char(6),username nvarchar(10))
go

create trigger user_insert on [user]
for insert
as
begin
insert [month_user]([month],username) 
select 
convert(char(6),getdate(),112),--取当前年月
username 
from 
inserted
end
go
--删除同步时,可以用触发器以username为唯一、主键时
create trigger user_del on [User]
for delete 
as
delete a from month_user a join deleted d on a.username=d.username
go
测试:
insert [user] values(N'张三') 
insert [user] values(N'李四') 
insert [user] values(N'王五'