提一个高级点的问题大家来讨论

zhiang75 2005-06-28 12:03:30
有这样的一个表
CREATE TABLE [dbo].[TABLE1] (
[ID] [uniqueidentifier] NOT NULL ,
[number] [int] IDENTITY (1, 1) NOT NULL ,
[流程1] [datetime] NOT NULL ,
[流程2] [datetime] NOT NULL ,
[流程3] [datetime] NOT NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[TABLE1] WITH NOCHECK ADD
CONSTRAINT [PK__TABLE1__23BE4960] PRIMARY KEY CLUSTERED
(
[ID]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[TABLE1] ADD
CONSTRAINT [DF_TABLE1_ID] DEFAULT (newid()) FOR [ID],
CONSTRAINT [DF_TABLE1_流程1] DEFAULT (getdate()) FOR [流程1],
CONSTRAINT [DF_TABLE1_流程2] DEFAULT (getdate()) FOR [流程2],
CONSTRAINT [DF__TABLE1__流程3__25A691D2] DEFAULT (getdate()) FOR [流程3],
CONSTRAINT [UQ__TABLE1__24B26D99] UNIQUE NONCLUSTERED
(
[number]
) ON [PRIMARY]
GO

可以看到[number] [int] IDENTITY (1, 1)是自动编号的

有这样的一个存储过程
ALTER PROCEDURE dbo.StoredProcedure1

AS
BEGIN TRANSACTION
INSERT INTO TABLE1
(流程1)
VALUES ('2005-1-2')

if(@@ERROR=0)
begin
COMMIT TRANSACTION
end
else
begin
ROLLBACK TRANSACTION
end

RETURN @@ERROR

现在我们执行存储过程...一切都很好,数据都增加..[number]编号也是连续的...
现在我们去掉[ID]的默认值newid()保存表 然后在执行存储过程....(模拟实际应用中会发生的不可预知的错误)
当然会报错误...

然后我们在添加[ID]的默认值newid()保存表.....
OK..我们继续执行存储过程,这次不会报错了
奇怪的事情发生了......[number]编号不连续了...

我不知道发生了什么...但是我使用了事务...这个事务没有达到我希望的目的..在任何情况下保持编号连续
因此在一些应用中使用IDENTITY会发生问题....
难道我一定要使用缓慢的MAX(number)吗?

还是我的写法有问题?

请各位指点...谢谢






...全文
228 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
孤帆远影_q 2005-07-03
  • 打赏
  • 举报
回复
刚才漏了几个字:是不用自己手动回滚。
孤帆远影_q 2005-07-03
  • 打赏
  • 举报
回复
好像你的过程编的思路不对。照下面修改试试:
ALTER PROCEDURE dbo.StoredProcedure1
AS
SET XACT_ABORT ON
BEGIN TRANSACTION
INSERT INTO TABLE1
(流程1)
VALUES ('2005-1-2')
COMMIT TRANSACTION
RETURN @@error

说明:@@error是在过程提交,执行完后的返回值。而且自己手动回滚的,sql自己会回滚的。
zhiang75 2005-07-03
  • 打赏
  • 举报
回复
好我在试试
zhiang75 2005-07-02
  • 打赏
  • 举报
回复
up
zhiang75 2005-07-01
  • 打赏
  • 举报
回复
继续UP
天地客人 2005-06-30
  • 打赏
  • 举报
回复
关注中!
zhiang75 2005-06-30
  • 打赏
  • 举报
回复
UP
孤帆远影_q 2005-06-29
  • 打赏
  • 举报
回复
在CREATE 之前 加入语句:
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[StoredProcedure1]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[StoredProcedure1]
GO

孤帆远影_q 2005-06-29
  • 打赏
  • 举报
回复
不要用ALTER 关键字,改用 CREATE 试试!
两者在内部处理时有区别的。
fbilibf 2005-06-29
  • 打赏
  • 举报
回复
都是高手。。。哈哈
pbsql 2005-06-28
  • 打赏
  • 举报
回复
INSERT INTO TABLE1...会使自动编号递增,即使该INSERT语句没执行成功而被rollback了

可以使用DBCC CHECKIDENT来对标识值进行更改
zhiang75 2005-06-28
  • 打赏
  • 举报
回复
up
zhiang75 2005-06-28
  • 打赏
  • 举报
回复
to Qzh7523(孤魂)
改成了这样
ALTER PROCEDURE dbo.StoredProcedure1
AS
SET XACT_ABORT ON
BEGIN TRANSACTION
INSERT INTO TABLE1
(流程1)
VALUES ('2005-1-2')
if(@@ERROR=0)
begin
COMMIT TRANSACTION
end
else
begin
ROLLBACK TRANSACTION
end
RETURN

不行....没有关系大家继续讨论


孤帆远影_q 2005-06-28
  • 打赏
  • 举报
回复
在AS后,BEGIN TRANSACTION之前
加入 SET XACT_ABORT ON 这样强制回滚所有事务;
否则默认是OFF的,只回滚当前错误的语句,事务照样执行完的。
zhiang75 2005-06-28
  • 打赏
  • 举报
回复
谢谢mengzulin(Julian)

没办法了,这样这样做是为了提高系统的效率了....麻烦一点吧...唉.
表中的数据是不删的,因此唯一不连续的原因就是在插入了...

感觉这样做应该比使用一个计数表要快....还有用数据操作都是使用事务的...要是不快点
又该有讨厌的死锁了....

还有更好的吗?.....
mengzulin 2005-06-28
  • 打赏
  • 举报
回复
sorry,我看错了,我以为你要返回@P_bi1
zicxc 2005-06-28
  • 打赏
  • 举报
回复
同意一楼

使用IDENTITY就不要强求连续,否则你会忙死,产生不连续的因素很多
zhiang75 2005-06-28
  • 打赏
  • 举报
回复
????to mengzulin(Julian)
mengzulin 2005-06-28
  • 打赏
  • 举报
回复
改成这样才对

ALTER PROCEDURE dbo.StoredProcedure1
@P_bi1 int=0
AS
BEGIN TRANSACTION
INSERT INTO TABLE1
(流程1)
VALUES ('2005-1-2')

if(@@ERROR=0)
begin
   set @P_bi1=@@IDENTITY
   COMMIT TRANSACTION
end
else
begin
   ROLLBACK TRANSACTION
   set @P_bi1=(SELECT (MAX(number)) as e1 FROM TABLE1)
   DBCC CHECKIDENT (TABLE1, RESEED,@P_bi1)
end



RETURN

没有更简单点的了吗.
zhiang75 2005-06-28
  • 打赏
  • 举报
回复
改成这样才正确..
ALTER PROCEDURE dbo.StoredProcedure1
@P_bi1 int=0
AS
BEGIN TRANSACTION
INSERT INTO TABLE1
(流程1)
VALUES ('2005-1-2')

if(@@ERROR=0)
begin
COMMIT TRANSACTION
end
else
begin
ROLLBACK TRANSACTION
set @P_bi1=(SELECT (MAX(number)) as e1 FROM TABLE1)
DBCC CHECKIDENT (TABLE1, RESEED,@P_bi1)
end



RETURN

没有更简单点的了吗.
加载更多回复(2)

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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