关于在存储过程中使用rollback的问题

wanghuirui 2004-12-02 09:12:24
CREATE PROCEDURE sp_website_modi --网址大全修改
@id int,
@name nvarchar(100),
@fid nvarchar(4), --原fid
@newfid nvarchar(4), --新fid
@iscolor int=0,
@isindex int=0,
@url nvarchar(100)=null,
@description nvarchar(2000)=null
as
set nocount on
begin
begin tran

update website set name=@name,fid=@newfid,iscolor=@iscolor,isindex=@isindex,url=@url,description=@description where id=@id

if @@error<>0 --有错误进行回滚
begin
rollback tran
return 0 --返回0表示添失败
end

update website_fenlei set num=num+1 where fid=@newfid --二级分类+1

if @@error<>0 --有错误进行回滚
begin
rollback tran
return 0 --返回0表示添失败
end

update website_fenlei set num=num+1 where fid=substring(@newfid,1,2)+'00' --一级分类+1

if @@error<>0 --有错误进行回滚
begin
rollback tran
return 0 --返回0表示添失败
end

update website_fenlei set num=num-1 where fid=@fid --二级分类-1

if @@error<>0 --有错误进行回滚
begin
rollback tran
return 0 --返回0表示添失败
end

update website_fenlei set num=num-1 where fid=substring(@fid,1,2)+'00' --一级分类-1

if @@error<>0 --有错误进行回滚
begin
rollback tran
return 0 --返回0表示添失败
end


commit tran

return 1
end
GO

在这个过程中每做一次数据处理都调用rollback这样很不好,如果只用一次rollback,任何一条语句处理出了问题都回滚
...全文
524 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
tddw 2004-12-03
  • 打赏
  • 举报
回复
这样就可以了,最好的解决办法:
CREATE PROCEDURE sp_website_modi --网址大全修改
@id int,
@name nvarchar(100),
@fid nvarchar(4), --原fid
@newfid nvarchar(4), --新fid
@iscolor int=0,
@isindex int=0,
@url nvarchar(100)=null,
@description nvarchar(2000)=null
as
declare @retcode int
select @retcode = 1
set nocount on
begin
begin tran

update website set name=@name,fid=@newfid,iscolor=@iscolor,isindex=@isindex,url=@url,description=@description where id=@id

if @@error<>0 --有错误进行回滚
begin
select @retcode = 0
goto L_end
end

update website_fenlei set num=num+1 where fid=@newfid --二级分类+1

if @@error<>0 --有错误进行回滚
begin
select @retcode = 0
goto L_end
end

update website_fenlei set num=num+1 where fid=substring(@newfid,1,2)+'00' --一级分类+1

if @@error<>0 --有错误进行回滚
begin
select @retcode = 0
goto L_end
end

update website_fenlei set num=num-1 where fid=@fid --二级分类-1

if @@error<>0 --有错误进行回滚
begin
select @retcode = 0
goto L_end
end

update website_fenlei set num=num-1 where fid=substring(@fid,1,2)+'00' --一级分类-1

if @@error<>0 --有错误进行回滚
begin
select @retcode = 0
goto L_end
end


L_end:
if @retcode = 1
commit tran
else
rollback tran
return @retcode
end
GO
wanghuirui 2004-12-03
  • 打赏
  • 举报
回复
谢谢楼上的,大家还有法子没
Andy__Huang 2004-12-02
  • 打赏
  • 举报
回复
是你自己處理得不好了,你那樣寫代碼不規范
給你一個例子看,你就知道了


CREATE PROC dbo.procInsert
(@orderNo varchar(4),@orderName varchar(20),@orderNum numeric(10,2))
AS
BEGIN TRAN
SET NOCOUNT ON
SET ANSI_WARNINGS OFF

INSERT INTO dbo.TabX(order_no,order_name,order_num)
VALUES(@OrderNo,@OrderName,@OrderNum)

IF @@ERROR<>0 GOTO errhandle---->發生錯誤直接跳轉到後面,不發生錯誤提交
COMMIT TRAN
SELECT 1

errhandle:
IF @@ERROR<>0
BEGIN
ROLLBACK TRAN
SELECT 0
END

GO

--成功返回1,失敗返回0
//附加数据库 sp_attach_db 当使用 sp_attach_db 系统存储过程附加数据库时。 sp_attach_db:将数据库附加到服务器。 语法 sp_attach_db [ @dbname = ] 'dbname' , [ @filename1 = ] 'filename_n' [ ,...16 ] 参数 [@dbname =] 'dbname' 要附加到服务器的数据库的名称。该名称必须是唯一的。dbname 的数据类型为 sysname,默认值为 NULL。 [@filename1 =] 'filename_n' 数据库文件的物理名称,包括路径。filename_n 的数据类型为 nvarchar(260),默认值为 NULL。最多可以指定 16 个文件名。 参数名称以 @filename1 开始,递增到 @filename16。文件名列表至少必须包括主文件,主文件包含指向数据库其它文件的系统表。 该列表还必须包括数据库分离后所有被移动的文件。 返回代码值:0(成功)或 1(失败) eg:下面的示例将 pubs 的两个文件附加到当前服务器。 EXEC sp_attach_db @dbname = N'pubs', @filename1 = N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf', @filename2 = N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs_log.ldf' EXEC sp_attach_db @dbname = N'Ty20051029101451aaa', @filename1 = N'd:\5屏幕\Ty20051029101451aaa_data.mdf', @filename2 = N'd:\5屏幕\Ty20051029101451aaa_log.ldf' ---解决问题了 //删除数据库 DROP DATABASE 从Microsoft? SQL Server? 删除一个或多个数据库。删除数据库将删除数据库所使用的数据库文件和磁盘文件。 语法 :DROP DATABASE database_name [ ,...n ] 参数 :database_name 指定要删除的数据库名称。从 master 数据库执行 sp_helpdb 以查看数据库列表。 eg: exec sp_helpdb database_name exec Drpo DataBase [Ty20051029101451aaa] //分离数据库 可以使用 sp_detach_db 存储过程分离该数据库,然后使用带有 FOR ATTACH 子句的 CREATE DATABASE 重新附加。 sp_detach_db Archive GO CREATE DATABASE Archive ON PRIMARY (FILENAME = 'c:\program files\microsoft sqlserver\mssql\data\archdat1.mdf') FOR ATTACH GO //显示当前数据库信息 --select * from Master..sysDatabases //新建---不行啊 CREATE DATABASE TestOA ALTER DATABASE TestOA SET OFFLINE WITH ROLLBACK IMMEDIATE RESTORE DATABASE TestOA From disk='C:\Documents and Settings\Administrator\桌面\帐套\data\Template.Dat' ALTER DATABASE TestOA SET OFFLINE WITH ROLLBACK IMMEDIATE exec sp_detach_db Km20051030011601 --分离数据库 exec sp_attach_single_file_db km20051030011601,'D:\TestDatabase\Km20051030011601.mdf'--只附加.mdf文件

34,837

社区成员

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

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