请教如何在SQL语句中循环

bowlingljf 2008-11-19 05:13:16
有一个员工资料表如下:

员工编号 姓名 正式员工 转正日期 ....
001 张三 是 2008-11-09
002 李四 否 2008-11-09
003 王五 否 2008-11-19
004 张六 否 2008-11-19
005 李云 否 2008-11-08
.
.
.
1、我需要循环这个表,然后判断这个员工是否为正式员工,如果否,然后再判断转正日期是不是今天或今天以前,如果满足这两个条件,就将这条数据写到另一个表中
1)循环表中所有的数据
2)判断正式员工为否,转正日期等于今天或小于今天
3)将这条数据的员工编号,姓名两列写到另一个表中

2、以上操作在一个存储过程中实现

请问以上要求怎么实现?

我现在是先建一个变量,然后查询所有数据,用count函数取得总记录数保存在这个变量中,但我不会一条条往下面判断,请各位帮忙。
...全文
744 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
fcuandy 2008-11-20
  • 打赏
  • 举报
回复
知道你的意思了。

你是说 select .... from 员工资料表 。。 有多条记录,
当插入时,产生了相同的 a表的新id.

你用的sql2005还是sql2000?
bowlingljf 2008-11-20
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 fcuandy 的回复:]
dbo.f_NextID()

这个函数应该是在表A中操作而不是员工资料表。
[/Quote]

这个函数是操作的表A,取得表A最后一个ID值
fcuandy 2008-11-20
  • 打赏
  • 举报
回复
dbo.f_NextID()

这个函数应该是在表A中操作而不是员工资料表。
bowlingljf 2008-11-20
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 bowlingljf 的回复:]
insert 表A(编号,姓名) select 编号,姓名 from 员工资料表 where 正式员工='否' and 转正日期 <=convert(varchar(10),getdate(),120)

表A的结构如下:

ID 编号 姓名

说明:1、ID字段是char类型,不允许重复,是主键,保存的数据如H20080001之类的数据,我有一个函数dbo.f_NextID(),可以得到一个新的ID值,在原来ID基础上加1,比如现在有一条数据H20080001,用dbo.f_NextID()得到的数据是H20080002
2、编号和姓名…
[/Quote]

---------------------
试了多种办法都不行,看来只有把ID字段改为int类型,然后设置自动增长了
zhangyisc 2008-11-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fcuandy 的回复:]
SQL codeinsert另一个表(编号,姓名)select编号,姓名from员工资料表where正式员工='否'and转正日期<=convert(varchar(10),getdate(),120)
[/Quote] 正解哈
ou_yangpengfei 2008-11-20
  • 打赏
  • 举报
回复
今天散分的怎么怎么多啊
zjcxc 元老 2008-11-20
  • 打赏
  • 举报
回复
to: test_000_001

你这样在别人的帖子里弄这些是很不对的行为
bowlingljf 2008-11-20
  • 打赏
  • 举报
回复
OK
fcuandy 2008-11-20
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 bowlingljf 的回复:]
TO fcuandy :是的,就是你理解的意思。我用的是sql2000

因为select .... from 员工资料表 。。 有多条记录

所以 当插入时,产生了相同的 a表的新id. 所以会报错,因为id不允计重复的
[/Quote]

/*
设 ta 里编号形如
ABC0000123
ABC0010323
这样
*/


SELECT IDENTITY(INT) nid,编号,姓名
INTO #
FROM 员工资料表
WHERE 正式员工='否' AND 转正日期 <=CONVERT(VARCHAR(10),GETDATE(),120)

INSERT ta(id,编号,姓名)
SELECT 'ABC' + RIGHT('0000000' + RTRIM(nid /*这里要不要-1看看你函数取的时候是否加过1*/+ CAST(STUFF(x,1,3,'') /*应该stuff多长字串要看你的特定串的格式*/ AS INT)),7),编号,姓名
FROM # a
CROSS JOIN
(SELECT x = dbo.f_NextID()) b

DROP TASBLE #
GO

--未测试可能手误,你自己调试一下。
linguojin11 2008-11-20
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 bowlingljf 的回复:]
引用 11 楼 bowlingljf 的回复:
insert 表A(编号,姓名) select 编号,姓名 from 员工资料表 where 正式员工='否' and 转正日期 <=convert(varchar(10),getdate(),120)

表A的结构如下:

ID 编号 姓名

说明:1、ID字段是char类型,不允许重复,是主键,保存的数据如H20080001之类的数据,我有一个函数dbo.f_NextID(),可以得到一个新的ID值,在原来ID基础上加1,比如现在有一条数据H20080001,用dbo.f_NextID()得到的…
[/Quote]if object_id('test') is not null
drop table test
if object_id('tempdb..#t') is not null
drop table #t
if object_id('getcount') is not null
drop proc getcount
go
create table test(员工编号 varchar(10),姓名 varchar(20),正式员工 varchar(20),转正日期 varchar(20))
insert into test select '001' , ' 张三', '是', ' 2008-11-09'
insert into test select '002' , ' 李四', '否', ' 2008-11-09'
insert into test select '003' , ' 王五', '否', ' 2008-11-19 '
insert into test select '004' , ' 张六', '否' , ' 2008-11-19 '
insert into test select '005' , ' 李云' ,'否' , ' 2008-11-08 '
insert into test select '006' , ' 张三1', '是' , ' 2008-11-09'
insert into test select '007', ' 李四1' ,'否', ' 2008-11-09'
insert into test select '008' , ' 王五1', '否' , ' 2008-11-19 '
insert into test select '009' , ' 张六1', '否', ' 2008-11-19 '
insert into test select '010' , ' 李云1' ,'否', ' 2008-11-08 '
create table #t(员工编号 varchar(10))
go
create proc getcount
as
begin
declare @count int,@countsum int
set @countsum=(select count(*) from test)
set @count=1
while (@count<=10 )
begin
insert into #t select 员工编号 from test where 员工编号=right(rtrim('00'+ltrim(@count)),3) and 正式员工='否' and 转正日期<=getdate()
set @count=@count+1
end
end
go
exec getcount
select * from #t
linguojin11 2008-11-20
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 bowlingljf 的回复:]
引用 11 楼 bowlingljf 的回复:
insert 表A(编号,姓名) select 编号,姓名 from 员工资料表 where 正式员工='否' and 转正日期 <=convert(varchar(10),getdate(),120)

表A的结构如下:

ID 编号 姓名

说明:1、ID字段是char类型,不允许重复,是主键,保存的数据如H20080001之类的数据,我有一个函数dbo.f_NextID(),可以得到一个新的ID值,在原来ID基础上加1,比如现在有一条数据H20080001,用dbo.f_NextID()得到的…
[/Quote]
你的ID列是连续的,所以还是可以解决
将ID分解为: (前面字符串)+(整形转字符串)
liubei611 2008-11-20
  • 打赏
  • 举报
回复
快乐:你要想在sql中实现一条一条的循环,必须用游标,可是那样效率太慢了
bowlingljf 2008-11-20
  • 打赏
  • 举报
回复
TO fcuandy :是的,就是你理解的意思。我用的是sql2000

因为select .... from 员工资料表 。。 有多条记录

所以 当插入时,产生了相同的 a表的新id. 所以会报错,因为id不允计重复的
bowlingljf 2008-11-19
  • 打赏
  • 举报
回复
insert 表A(编号,姓名) select 编号,姓名 from 员工资料表 where 正式员工='否' and 转正日期<=convert(varchar(10),getdate(),120)

表A的结构如下:

ID 编号 姓名

说明:1、ID字段是char类型,不允许重复,是主键,保存的数据如H20080001之类的数据,我有一个函数dbo.f_NextID(),可以得到一个新的ID值,在原来ID基础上加1,比如现在有一条数据H20080001,用dbo.f_NextID()得到的数据是H20080002
2、编号和姓名字段与员工资料表的一样

这里有一个问题,我在insert表A时,这个ID字段怎么办?怎么插入ID字段的值?

insert 表A(ID,编号,姓名) select dbo.f_NextID(), 编号,姓名 from 员工资料表 where 正式员工='否' and 转正日期<=convert(varchar(10),getdate(),120)

执行上面语句出错,因为满足where 正式员工='否' and 转正日期<=convert(varchar(10),getdate(),120)的数据有多条时,select dbo.f_NextID()的值都是相同的,而这个字段是主键不允许重复。
bowlingljf 2008-11-19
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20081119/17/0d8da0c6-4339-4ea2-9c44-66fb28be84ba.html

新开了一贴
bowlingljf 2008-11-19
  • 打赏
  • 举报
回复
但这个循环的问题我确实不知道怎么解决,我有另外一个问题目前是读到界面的DataGridView控件中解决,感觉数据多了有点慢,我整理一下数据重开一贴,麻烦各位再帮我看看。
百年树人 2008-11-19
  • 打赏
  • 举报
回复
insert TB(编号,姓名) 
select 员工编号,姓名
from [员工资料表]
where 正式员工='否' and datediff(day,转正日期,getdate())<=0
bowlingljf 2008-11-19
  • 打赏
  • 举报
回复
感谢各位,方法挺简单的,看来是我的思路错了。

这种问题以前都是先把数据读到UI的控件中,然后循环一行行判断再加入其它表,因为这个问题想在SQL后台完成,不想用界面实现,所以要实现这个功能。
csdyyr 2008-11-19
  • 打赏
  • 举报
回复
sql对记录集进行操作,其实就是循环了
中国风 2008-11-19
  • 打赏
  • 举报
回复
insert NewTable(员工编号,姓名)
select 员工编号,姓名 from Employees where 正式员工=N'是' and 转正日期<=convert(varchar(10),getdate(),120)
加载更多回复(4)

34,590

社区成员

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

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