SQLServer存储过程中有事物,怎样取得执行成功与否的标记,的return和返回值问题,有什么区别

WYhack 2011-08-11 09:21:56
实话说对sqlserver的存储过程并不熟悉,先求教,希望指点,给点资料也行,谢谢


CREATE PROCEDURE pro
-- Add the parameters for the stored procedure here
@i nvarchar(20),
@j int
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
--事物
-- Insert statements for procedure here
--事物
update table1
if(@@error>0)
--回滚

--事物提交

--事物
delete from table2
if(@@error>0)
--回滚
--事物提交

--异常回滚

--事物提交
END
GO


类似以上的存储过程,更新一个表,同时删除另外一个表,放在一个事物中,我先要执行成功与否的标记,该怎么写“返回值”,是写return还是写返回值?

能写return的话该怎么写,该怎么取得该return的标记,返回值又怎么写(设定),

写return和返回值又什么区别?



再问一下:设计表的时候,做删除数据的时候,应该是标记一个状态好还是做物理删除好?

...全文
416 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
AcHerat 2011-08-11
  • 打赏
  • 举报
回复

create table tb(id int identity(1,1),ic int unique)
insert into tb select 2
go

create proc pro
@i int,
@j int output,
@k int output
AS
BEGIN
begin try
begin tran
insert into tb select @i
set @j = 0
commit
end try
begin catch
rollback
set @j=1
end catch

begin try
begin tran
update tb set ic = 1 where id = @i
set @k = 0
commit
end try
begin catch
rollback
set @k=1
end catch
END
GO

declare @m int,@n int
exec pro 1,@m output,@n output
select * from tb
select @m,@n

drop proc pro
drop table tb

/***********

id ic
----------- -----------
1 2
2 1

(2 行受影响)


----------- -----------
0 1

(1 行受影响)
WYhack 2011-08-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 acherat 的回复:]

SQL code

CREATE PROCEDURE pro
-- Add the parameters for the stored procedure here
@i nvarchar(20),
@j int,
@update int output,
@delete int output
AS
BEGIN
-- SET NOCOUNT ON ……
[/Quote]

        begin
set @update = 1
--回滚
end


这里能不能直接写 set @update = 1?begin……end的作用是什么?
geniuswjt 2011-08-11
  • 打赏
  • 举报
回复
if @@error<>0
begin
set @i=-1
rollback tran
return @i ----这里的renturn的值怎么取得到?
end
[Quote=引用 11 楼 wdmxznl 的回复:]
SQL code
SQL语句3
if @@error<>0
begin
rollback tran
return -1 ----这里的renturn的值怎么取得到?
end
[/Quote]
wdmxznl 2011-08-11
  • 打赏
  • 举报
回复
SQL语句3  
if @@error<>0
begin
rollback tran
return -1 ----这里的renturn的值怎么取得到?
end
wdmxznl 2011-08-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 acherat 的回复:]

SQL code

CREATE PROCEDURE pro
-- Add the parameters for the stored procedure here
@i nvarchar(20),
@j int,
@update int output,
@delete int output
AS
BEGIN
-- SET NOCOUNT ON ……
[/Quote]


像这样的事物处理方式,假如第一个sql执行成功,后边的一个执行失败,前面执行成功的会回滚么?
为什么?

create proc aaa  
参数...
as
begin tran
SQL语句1
if @@error<>0
begin
rollback tran
return -1
end
SQL语句2
if @@error<>0
begin
rollback tran
return -1
end
SQL语句3
if @@error<>0
begin
rollback tran
return -1
end

commit tran
go
rmini 2011-08-11
  • 打赏
  • 举报
回复
不太熟悉,作为学习资料收藏
快溜 2011-08-11
  • 打赏
  • 举报
回复
create PROCEDURE pro
@i nvarchar(20),
@j varchar(5) output
AS
BEGIN
declare @num datetime
begin try
begin tran
set @num=@i
set @j='成功'
commit
end try
begin catch
rollback
set @j='失败'
end catch
END
GO

declare @num varchar(5)

exec pro 'aa',@num output
select @num
/*失败*/

exec pro '20110811',@num output

select @num

/*成功*/
NBDBA 2011-08-11
  • 打赏
  • 举报
回复
再问一下:设计表的时候,做删除数据的时候,应该是标记一个状态好还是做物理删除好?

这要看需求,如果你的数据是财务数据,你可能需要做逻辑删除,以便查数,如果不重要数据,直接删除克节省空间并提高性能
AcHerat 2011-08-11
  • 打赏
  • 举报
回复

CREATE PROCEDURE pro
-- Add the parameters for the stored procedure here
@i nvarchar(20),
@j int,
@update int output,
@delete int output
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
--事物
-- Insert statements for procedure here
--事物
update table1
if(@@error>0)
begin
set @update = 1
--回滚
end
set @update = 0
--事物提交

--事物
delete from table2
if(@@error>0)
begin
set @delete = 1
--回滚
end
set @delete = 0
--事物提交

--异常回滚

--事物提交
END
GO


这样应该也能获取到执行成功与否的标记。
NBDBA 2011-08-11
  • 打赏
  • 举报
回复
我先要执行成功与否的标记,该怎么写“返回值”
每句执行后判断@@error全局变量(2000)或者用Try...Catch结构

能写return的话该怎么写,该怎么取得该return的标记,返回值又怎么写(设定),
可以return,return只能返回int,怎么定义你自己决定,与程序有约定就可以

写return和返回值又什么区别?
返回值可返回多种类型数据,return只能int
AcHerat 2011-08-11
  • 打赏
  • 举报
回复
再问一下:设计表的时候,做删除数据的时候,应该是标记一个状态好还是做物理删除好?

如果删除掉的数据以后要用到,那么可以建立一张历史表,把删除的数据放进历史表,然后删除这条数据

如果删除了就不管这条数据,那么直接物理删除。
chuanzhang5687 2011-08-11
  • 打赏
  • 举报
回复
第二个,可以添加两列 一个是逻辑删除,一个是物理删除!
AcHerat 2011-08-11
  • 打赏
  • 举报
回复
做两个输出字段,来标记更新和删除具体哪个事务有异!
chuanzhang5687 2011-08-11
  • 打赏
  • 举报
回复
ruturn就可以!
gogodiy 2011-08-11
  • 打赏
  • 举报
回复
最简单的办法:

CREATE PROCEDURE pro
@i nvarchar(20),
@j int,
@Result BIGINT OUTPUT
AS
BEGIN
SET NOCOUNT ON;

SET XACT_ABORT ON

BEGIN TRANSACTION

update table1

delete from table2

COMMIT TRANSACTION

SET @Result=1 --执行成功
END
GO
源码直接下载地址: https://pan.quark.cn/s/a4b39357ea24 平台简介 License Spring Boot JDK-17 本项目基于ruoyi-vue-fast实现 项目代码、文档 均开源免费可商用 遵循开源协议在项目中保留开源协议文件即可 活到老写到老 为兴趣而开源 为学习而开源 为让大家真正可以学到技术而开源 若依wms是一套基于若依的wms仓库管理系统,支持lodop和网页打印入库单、出库单。 毫无保留给个人及企业免费使用。 前端采用Vue、Element UI。 后端采用Spring Boot、Spring Security、Redis & Jwt。 权限认证使用Jwt,支持多终端认证系统。 支持加载动态权限菜单,多方式轻松权限控制。 高效率开发,使用代码生成器可以一键生成前后端代码。 前端项目地址 gitee https://gitee.com/zccbbg/ruo-yi-wms-vue https://.com/zccbbg/RuoYi-WMS-VUE 若依实战技术专栏 关注文末公众号回复:星球 在线体验 https://wms.ichengle.top/ 不同分支介绍 jdk17+vue3,支持多仓库,没有库区概念,操作简单,覆盖大部分库存应用场景。 jdk17+vue3,支持多仓库、多库区,记录生产日期、过期日期、sn,可适配一物一码,操作相对复杂。 jdk8+vue2 同步lite分支 若依wms功能 首页:库存预警与到期提醒、基础数据报表展示 仓库/库区:管理维护仓库基础数据 物料:管理维护物料基础数据 客户/供应商:管理维护联系人基础数据 入库:创建入库单后包括如下几个状态:暂存、作废、完成入库,入库类型包括:采购...

27,579

社区成员

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

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