导航
  • 主页
  • 基础类
  • 应用实例
  • 新技术前沿

修改时出错

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语句起作用
...全文
123 点赞 收藏 19
写回复
19 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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
回复
发动态
发帖子
MS-SQL Server
创建于2007-09-28

3.2w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
社区公告
暂无公告