写存储过程,如何实现循环更新,每次循环更新固定记录数的某字段的值?

postmanlly 2010-05-13 02:10:24
比如说:某表A有550条记录,
从第一条开始,
1-100条,字段state更新为1,
101-200,字段state更新为2,
201-300,字段state更新为3,
以此类推,直至最后50条记录更新为n,
1~n也是从另外一张表中循环取出来的值。

请各位高手帮忙解答,谢谢!
...全文
199 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
postmanlly 2010-05-13
  • 打赏
  • 举报
回复
现在主要卡在怎么样在每个审核人员的循环中,得到要更新的论文主表记录集,即这次循环中要更新记录的条件,哪一条到哪一条?

高手同志们,急啊~~~~~
postmanlly 2010-05-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 sql77 的回复:]

引用 7 楼 postmanlly 的回复:
引用 5 楼 sql77 的回复:

引用 4 楼 postmanlly 的回复:
引用 1 楼 sql77 的回复:

UPDATE TB SET STATE=((ID-1)/100)+1


我说的1~n,只是个比方,其实是更新成从另一张表中取出的值,比如tt、ss、qq。。。。

如果不确定,就CASE WHEN


……
[/Quote]

关键是表的记录数不确定,要动态获取的,并且ID虽然是自增,但是并不一定是连续的,有可能有记录删除的情况。
问题原本是个论文分配的程序:有若干篇文章,要求自动平均分配给若干个审核人员(从另一张表中取出),分配好后把审核人员更新至论文表中。。。
postmanlly 2010-05-13
  • 打赏
  • 举报
回复
其实我的代码是这样的,但是不行

Create PROCEDURE [dbo].[sp_AssignPaper]
@CURRENTUSER VARCHAR(20)
AS
BEGIN
DECLARE @I INT
DECLARE @MAX INT
DECLARE @CT INT
DECLARE @PageLowerBound INT
DECLARE @PageUpperBound INT
DECLARE @username VARCHAR(20)
DECLARE @PcmemberList TABLE(id int IDENTITY(1, 1),USERNAME VARCHAR(20))

insert into @PcmemberList
select UserName from AUDIT_USER where roletype=3
and domainid=(select top 1 domainid from AUDIT_USER where username=@CURRENTUSER)


SET @I=1
SELECT @MAX = MAX(ID) FROM @PcmemberList
select @CT=count(1) from UPLOADFILE where TRACKCHAIRUSER=@CURRENTUSER
AND PCMemberUser IS NULL and PAPERSTATUS=1

set @PageLowerBound=0
set @PageUpperBound=@PageLowerBound+ROUND(@CT/@MAX,0)
create table #pageindex(id int identity(1,1) not null,nid int)
set rowcount @PageUpperBound

WHILE (@I<=@MAX)
BEGIN

IF EXISTS (SELECT 1 FROM @PcmemberList WHERE ID = @I)
BEGIN
INSERT INTO #pageindex(nid) select fid from UPLOADFILE
SELECT @username=UserName FROM @PcmemberList WHERE id = @I
UPDATE UPLOADFILE SET PCMemberUser=@username
FROM UPLOADFILE F INNER JOIN #pageindex P ON F.FID=P.NID
WHERE F.PAPERSTATUS=2 AND F.TRACKCHAIRUSER=@CURRENTUSER AND F.PCMemberUser IS NULL
AND P.ID>@PageLowerBound AND P.ID<=@PageUpperBound
SET @I = @I+1
END
END

drop table #pageindex
END
SQL77 2010-05-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 postmanlly 的回复:]
引用 5 楼 sql77 的回复:

引用 4 楼 postmanlly 的回复:
引用 1 楼 sql77 的回复:

UPDATE TB SET STATE=((ID-1)/100)+1


我说的1~n,只是个比方,其实是更新成从另一张表中取出的值,比如tt、ss、qq。。。。

如果不确定,就CASE WHEN


更新值是循环取出来的,CASE WHEN肯定不行……
[/Quote]
你怎么把值弄过来?

UPDATE TB SET STATE=
CASE WHEN (ID-1)/100=0 THEN ...
postmanlly 2010-05-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sql_sf 的回复:]

搞个自增列呗
如果是2005
row_number()
[/Quote]

用row_number()怎么实现啊,愿闻其详!
postmanlly 2010-05-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 sql77 的回复:]

引用 4 楼 postmanlly 的回复:
引用 1 楼 sql77 的回复:

UPDATE TB SET STATE=((ID-1)/100)+1


我说的1~n,只是个比方,其实是更新成从另一张表中取出的值,比如tt、ss、qq。。。。

如果不确定,就CASE WHEN
[/Quote]

更新值是循环取出来的,CASE WHEN肯定不行撒
htl258_Tony 2010-05-13
  • 打赏
  • 举报
回复
如果没有ID或ID有断号,是需要创造个序列号才好判断。
SQL77 2010-05-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 postmanlly 的回复:]
引用 1 楼 sql77 的回复:

UPDATE TB SET STATE=((ID-1)/100)+1


我说的1~n,只是个比方,其实是更新成从另一张表中取出的值,比如tt、ss、qq。。。。
[/Quote]
如果不确定,就CASE WHEN
postmanlly 2010-05-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sql77 的回复:]

UPDATE TB SET STATE=((ID-1)/100)+1
[/Quote]

我说的1~n,只是个比方,其实是更新成从另一张表中取出的值,比如tt、ss、qq。。。。
sql_sf 2010-05-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sql_sf 的回复:]
搞个自增列呗
如果是2005
row_number()
[/Quote]
想多了
sql_sf 2010-05-13
  • 打赏
  • 举报
回复
搞个自增列呗
如果是2005
row_number()
SQL77 2010-05-13
  • 打赏
  • 举报
回复
UPDATE TB SET STATE=((ID-1)/100)+1

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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