这个问题该如何实现?
有一张简单的人名表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'王五')
insert [user] values(N'钱六')
insert [user] values(N'赵七')
go
select * from month_user
/*
month username
------ ----------
200710 张三
200710 李四
200710 王五
200710 钱六
200710 赵七
*/
测试删除同步:
delete [user] where userName=N'张三'
select * from month_user
/*
month username
------ ----------
200710 李四
200710 王五
200710 钱六
200710 赵七
(所影响的行数为 4 行)
*/
go
drop table [user],month_user
[解决办法]
最简单的方法就是在表中添加数据
CREATE TABLE zhiban
(
uid int primary key identity(1,1),
uname varchar(20),
watchdata datetime
)
INSERT INTO zhiban VALUES('张三','2007-1-1')
INSERT INTO zhiban VALUES('李四','2007-2-1')
INSERT INTO zhiban VALUES('王五','2007-3-1')
INSERT INTO zhiban VALUES('钱六','2007-4-1')
INSERT INTO zhiban VALUES('赵','2007-10-3')
declare @add datetime
select @add= convert(char(8),getdate(),112)
select * from zhiban where watchdata=@add
[解决办法]
create table [user](username nvarchar(10))
go
insert [user] values(N'张三 ')
insert [user] values(N'李四 ')
insert [user] values(N'王五 ')
insert [user] values(N'钱六 ')
insert [user] values(N'赵七 ')
go
create table month_user([month] datetime,username nvarchar(10))
go
create trigger user_insert on [month_user]
instead of insert
as
begin
declare @datetime datetime
set @datetime=isnull((select max(month) from month_user),dateadd(month,-1,'2007-01-01'))--初始时间
select * into # from inserted
update # set [month]=@datetime,@datetime=dateadd(month,1,@datetime)
insert month_user select * from #
end
go
生成记录表2009-01-01的值班表:
declare @date datetime
set @date='2009-01-01'
while @date!<isnull((select max([month]) from month_user),'2007-01-01')
insert month_user(username)
select * from [user]
go
select * from month_user
go
month username
------------------------------------------------------ ----------
2007-01-01 00:00:00.000 张三
2007-02-01 00:00:00.000 李四
2007-03-01 00:00:00.000 王五
2007-04-01 00:00:00.000 钱六
2007-05-01 00:00:00.000 赵七
2007-06-01 00:00:00.000 张三
2007-07-01 00:00:00.000 李四
2007-08-01 00:00:00.000 王五
2007-09-01 00:00:00.000 钱六
2007-10-01 00:00:00.000 赵七
2007-11-01 00:00:00.000 张三
2007-12-01 00:00:00.000 李四
2008-01-01 00:00:00.000 王五
2008-02-01 00:00:00.000 钱六
2008-03-01 00:00:00.000 赵七
2008-04-01 00:00:00.000 张三
2008-05-01 00:00:00.000 李四
2008-06-01 00:00:00.000 王五
2008-07-01 00:00:00.000 钱六
2008-08-01 00:00:00.000 赵七
2008-09-01 00:00:00.000 张三
2008-10-01 00:00:00.000 李四
2008-11-01 00:00:00.000 王五
2008-12-01 00:00:00.000 钱六
2009-01-01 00:00:00.000 赵七
2009-02-01 00:00:00.000 张三
2009-03-01 00:00:00.000 李四
2009-04-01 00:00:00.000 王五
2009-05-01 00:00:00.000 钱六
2009-06-01 00:00:00.000 赵七
(所影响的行数为 30 行)
