修改时出错

lixingkai2 2007-12-24 04:37:18
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO




ALTER PROCEDURE upSetPDataHead
@LANCfg INT,@Chid INT,@D INT
AS

--DECLARE @Chid INT
DECLARE @MChid INT


IF EXISTS(SELECT LANCfg FROM TblPDataHead WHERE LANCfg=@LANCfg)
BEGIN
--SELECT @Chid=Chid FROM TblPDataHead WHERE LANCfg=@LANCfg
SELECT @MChid= max(Chid) FROM TblPDataHead WHERE LANCfg=@LANCfg


IF @D<0 AND @Chid>1
/*工步减1*/
BEGIN
UPDATE TblPDataHead SET Chid=@Chid WHERE Chid=@Chid-1 AND LANCfg=@LANCfg
UPDATE TblPDataHead SET Chid=@Chid-1 WHERE Chid=@Chid AND LANCfg=@LANCfg

--RETURN
END


IF @D>0 AND @Chid<@MChid
/*工序加1*/
BEGIN
UPDATE TblPDataHead SET Chid=@Chid WHERE Chid=@Chid+1 AND LANCfg=@LANCfg
COMMIT TRAN
UPDATE TblPDataHead SET Chid=@Chid+1 WHERE Chid=@Chid AND LANCfg=@LANCfg
COMMIT TRAN
--RETURN
END
--RETURN
END


GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

--RETURN
END


IF @D>0 AND @Chid<@MChid
/*工序加1*/
BEGIN
UPDATE TblPDataHead SET Chid=@Chid WHERE Chid=@Chid+1 AND LANCfg=@LANCfg
COMMIT
UPDATE TblPDataHead SET Chid=@Chid+1 WHERE Chid=@Chid AND LANCfg=@LANCfg
COMMIT
--RETURN
END
--RETURN
END






GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

相连两个update语句,为什么只有后面update语句起作用
...全文
175 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
lixingkai2 2007-12-25
  • 打赏
  • 举报
回复
那该怎么处理呢?
create table ttt1 (chid int,name varchar(10))
insert into ttt1 select 5,'aa'
insert into ttt1 select 6,'bb'

declare @chid int
set @chid=5
update ttt1 set chid=case when a.chid=@chid then @chid+1 when a.chid=@chid+1 then @chid end
from ttt1 a

select * from ttt1

chid name
6 aa
5 bb
新建的数据表中可以用,在我的数据表中就有问题了提示chid不可以插入null消息515级别16状态2
hui_hui_2007 2007-12-25
  • 打赏
  • 举报
回复
update 后为何加上commit呢?
update 语句本身就是隐含事务吧。
wzy_love_sly 2007-12-25
  • 打赏
  • 举报
回复
hh
lixingkai2 2007-12-25
  • 打赏
  • 举报
回复
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO


ALTER PROCEDURE upSetPDataHead
@LANCfg INT,@Chid INT,@D INT
AS


DECLARE @Id INT
DECLARE @MChid INT

IF EXISTS(SELECT LANCfg FROM TblPDataHead WHERE LANCfg=@LANCfg)
BEGIN
SELECT @Id= DHid FROM TblPDataHead WHERE LANCfg=@LANCfg and Chid=@Chid
SELECT @MChid= max(Chid) FROM TblPDataHead WHERE LANCfg=@LANCfg


IF @D<0 AND @Chid>1

BEGIN
UPDATE TblPDataHead SET Chid=@Chid WHERE Chid=@Chid-1 AND LANCfg=@LANCfg
UPDATE TblPDataHead SET Chid=@Chid-1 WHERE DHid= @Id
Return
END




IF @D>0 AND @Chid<@MChid

BEGIN
UPDATE TblPDataHead SET Chid=@Chid WHERE Chid=@Chid+1 AND LANCfg=@LANCfg
UPDATE TblPDataHead SET Chid=@Chid+1 WHERE DHid= @Id
Return
END
Return
END



GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
谢谢各位的回答,问题已解决。现把答案添出来
lixingkai2 2007-12-24
  • 打赏
  • 举报
回复
楼上代码怎么调试通不过啊!
-狙击手- 2007-12-24
  • 打赏
  • 举报
回复
UPDATE   TblPDataHead   
SET case when Chid=@Chid then Chid=@Chid + 1
when Chid=@Chid+1 then @Chid
else Chid end
WHERE LANCfg=@LANCfg and chid between @chid and @chid + 1
wzy_love_sly 2007-12-24
  • 打赏
  • 举报
回复
where lancfg=@lancfg加屁股后面
lixingkai2 2007-12-24
  • 打赏
  • 举报
回复
但是还需要一个条件啊,在一个数据表中取出满足lancfg成立的数据记录集合再进行交换怎么实现
wzy_love_sly 2007-12-24
  • 打赏
  • 举报
回复
create table ttt1 (chid int,name varchar(10))
insert into ttt1 select 5,'aa'
insert into ttt1 select 6,'bb'

declare @chid int
set @chid=5
update ttt1 set chid=case when a.chid=@chid then @chid+1 when a.chid=@chid+1 then @chid end
from ttt1 a

select * from ttt1

chid name
6 aa
5 bb
-狙击手- 2007-12-24
  • 打赏
  • 举报
回复
declare @t table(name char(1),orderflag  int)
insert @t select 'd',1
insert @t select 'c',2
insert @t select 'b',3


begin
declare @i int

set @i = 1


update @t set orderflag = @i where orderflag = @i + 1
update @t set orderflag = @i+1 where orderflag = @i
end

select * from @t
/*

name orderflag
---- -----------
d 2
c 2
b 3

(所影响的行数为 3 行)

*/
delete from @t

insert @t select 'd',1
insert @t select 'c',2
insert @t select 'b',3
begin


update @t
set orderflag = case when orderflag = @i then @i + 1 when orderflag = @i+1 then @i else orderflag end


end

select * from @t

/*


name orderflag
---- -----------
d 2
c 1
b 3

(所影响的行数为 3 行)

*/
-狙击手- 2007-12-24
  • 打赏
  • 举报
回复
那要两条都起作用呢,我本意是想把前后两条记录的chid字段的值再做排序行成数据记录交换的效果!

---


交换chid的值???
lixingkai2 2007-12-24
  • 打赏
  • 举报
回复
那要两条都起作用呢,我本意是想把前后两条记录的chid字段的值再做排序行成数据记录交换的效果!
-狙击手- 2007-12-24
  • 打赏
  • 举报
回复
龟瞎说,go 哪有用呀

wzy_love_sly 2007-12-24
  • 打赏
  • 举报
回复
go完变量没了吧
wzy_love_sly 2007-12-24
  • 打赏
  • 举报
回复
楼主在来回改,感觉就只有第二条起作用,其实第一条也起到作用
lixingkai2 2007-12-24
  • 打赏
  • 举报
回复
呵呵,高手真多啊!谢谢各位!go加上去会出错的呀!
-狙击手- 2007-12-24
  • 打赏
  • 举报
回复
id  child lancfg
1 1 1
2 2 1

==
set @child = 1


UPDATE TblPDataHead SET Chid=@Chid WHERE Chid=@Chid+1 AND LANCfg=@LANCfg
COMMIT

---

id child lancfg
1 1 1
2 1 1

UPDATE TblPDataHead SET Chid=@Chid+1 WHERE Chid=@Chid AND LANCfg=@LANCfg
COMMIT

id child lancfg
1 2 1
2 2 1


----
-狙击手- 2007-12-24
  • 打赏
  • 举报
回复
晕,去掉commit吧
否则你有一部分数据发生两次更新,恢复原样了吧
dawugui 2007-12-24
  • 打赏
  • 举报
回复
中间加个go
UPDATE TblPDataHead SET Chid=@Chid WHERE Chid=@Chid+1 AND LANCfg=@LANCfg
go
UPDATE TblPDataHead SET Chid=@Chid+1 WHERE Chid=@Chid AND LANCfg=@LANCfg

34,838

社区成员

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

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