数据库事务使用 多条插入

liujintaozyc 2010-01-29 09:20:41
下面是我写一个过程 插入三个表中 我用到事务 大家看下我这样写有问题没 在性能和速度上是否需要修改
大家有什么好办法或建议没
ALTER proc [dbo].[pr_insertfwbuy](
@fm_title nvarchar(50),
@fm_sf int,
@fm_qy int,
@fm_dq int,
@fm_type int,
@fm_source int,
@fm_fwlx int,
@fm_price decimal(18, 0),
@fm_fwsm nvarchar(300),
@fm_mj int,
@fm_address nvarchar(50),
@fm_adduser int,
@u_name nvarchar(10),
@u_phone char(12),
@u_email char(30),
@u_qqmsn char(30),
@p_pathslt0 char(50),
@p_path0 char(50),
@p_pathslt1 char(50),
@p_path1 char(50),
@p_pathslt2 char(50),
@p_path2 char(50))
as
declare @fmid int;
begin tran--使用事务
--插入第一个表
insert into T_fwbuy(fm_title,fm_sf,fm_qy,fm_dq,fm_type,fm_source,fm_fwlx,fm_price,fm_fwsm,fm_mj,fm_address,fm_addtime,fm_endtime,fm_adduser,fm_enduser,fm_sfjs)
values(@fm_title,@fm_sf,@fm_qy,@fm_dq,@fm_type,@fm_source,@fm_fwlx,@fm_price,@fm_fwsm,@fm_mj,@fm_address,getdate(),getdate(),@fm_adduser,@fm_adduser,0)
select @fmid=@@identity;
--插入第二个表
insert into T_fwmmuser(u_newid,u_type,u_name,u_phone,u_email,u_qqmsn,u_addtime)
values(@fmid,@fm_type,@u_name,@u_phone,@u_email,@u_qqmsn,getdate());

declare @i int;
set @i=0
while @i<3
begin
if '@p_path'+@i!=null and '@p_path'+@i!=''
begin
--插入第三个表
insert into T_photo(P_type,p_newid,p_pathslt,p_path)
values(@fm_type,@fmid,'@p_pathslt'+@i,'@p_path'+@i)
end
set @i=@i+1;
end
rollback tran

...全文
189 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
liujintaozyc 2010-01-29
  • 打赏
  • 举报
回复
好的 谢谢你
jack15850798154 2010-01-29
  • 打赏
  • 举报
回复
如果有错误还请见谅。我的水平也不高。只提一点建议。我
create proc stup
@id int,
@name varchar(50)
as
declare @count int
begin
if(@id>0 and @name !='')
begin
begin transaction tran_msg

insert into stu1 values(@id,@name)

end
set @count=@@error
print @count
end

exec stup 2,'jack'
是有错误的我只是想告诉你应该定义一个变量。。不足之出还请见谅。。。
jack15850798154 2010-01-29
  • 打赏
  • 举报
回复
我认为如果是三个的话你应该定义一个变量来接受一下。。然后来对变来进行判断啊。。
jack15850798154 2010-01-29
  • 打赏
  • 举报
回复
create proc stup
@id int,
@name varchar(50)
as
declare @count int
begin
if(@id>0 and @name !='')
begin
begin transaction tran_msg

insert into stu1 values(@id,@name)

end
set @count=@@error
print @count
end

exec stup 2,'jack'
这个是我写的当中有点错误不过定义declare @count int
是对的。
liujintaozyc 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 jack15850798154 的回复:]
给你参考一下不知道对你有帮助吗?

ALTER proc [dbo].[Unigo_Community_DeletePrivateMessage]
@userId int,
@privateMessageId int
as
begin
if(@userId >0 and @privateMessageId >0)
begin
BEGIN TRANSACTION Tran_MSG
BEGIN
delete from user_to_p_msg
where user_id = @userId
and private_message_id = @privateMessageId
delete from P_MSG where user_id=@userId and private_message_id =@privateMessageId
END

IF (@@ERROR <>0)
ROLLBACK TRANSACTION Tran_MSG
ELSE
COMMIT TRANSACTION Tran_MSG
end
end

[/Quote]
其实我对事务也不是很了解 就是想得到大家一些肯定的帮助 我也不知道是否正确
请大家给我点肯定的建议 谢谢楼上
jack15850798154 2010-01-29
  • 打赏
  • 举报
回复
给你参考一下不知道对你有帮助吗?

ALTER proc [dbo].[Unigo_Community_DeletePrivateMessage]
@userId int,
@privateMessageId int
as
begin
if(@userId >0 and @privateMessageId >0)
begin
BEGIN TRANSACTION Tran_MSG
BEGIN
delete from user_to_p_msg
where user_id = @userId
and private_message_id = @privateMessageId
delete from P_MSG where user_id=@userId and private_message_id =@privateMessageId
END

IF (@@ERROR<>0)
ROLLBACK TRANSACTION Tran_MSG
ELSE
COMMIT TRANSACTION Tran_MSG
end
end
liujintaozyc 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 jack15850798154 的回复:]
判断这三条数据是否都成功如果成功就 commit,否则就rollback;
[/Quote]
你能帮我简单的写下吗 稍微改点也行 原理我知道判断是否成功 关键怎样判断我就不知道了
还有我这样写对性能之类是否会有影响
谢谢了
jack15850798154 2010-01-29
  • 打赏
  • 举报
回复
不知道对不。你可以定义一个变量如果成功就加一次呗。。如果不对还请见谅。。
jack15850798154 2010-01-29
  • 打赏
  • 举报
回复
判断这三条数据是否都成功如果成功就 commit,否则就rollback;
liujintaozyc 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zoezs 的回复:]
你是想只要有一个地方出错就全部回滚?
你的数据量大吗?
好像插入的时候没必要这样做。插入的时候判断一下@@error就好了。
[/Quote]
那我需要怎样做 具体点 谢谢
liujintaozyc 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 orchidcat 的回复:]
SQL codedeclare@iint;set@i=0while@i<3beginif'@p_path'+@i!=nulland'@p_path'+@i!=''

这句是不是有些多了。
@i>=0的情况下,这个判断条件始终成立的。



[/Quote]
下面有set @i=@i+1;
liujintaozyc 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 rucypli 的回复:]
commit呢
[/Quote]
我怎样改啊
jc_liumangtu 2010-01-29
  • 打赏
  • 举报
回复
我只看到了rollback
只有回滚没有提交动作?
Mr_Nice 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 rucypli 的回复:]
commit呢
[/Quote]

up,只rollback,莫有commit
Zoezs 2010-01-29
  • 打赏
  • 举报
回复
你是想只要有一个地方出错就全部回滚?
你的数据量大吗?
好像插入的时候没必要这样做。插入的时候判断一下@@error就好了。
Mr_Nice 2010-01-29
  • 打赏
  • 举报
回复
declare @i int; 
set @i=0
while @i <3
begin
if '@p_path'+@i!=null and '@p_path'+@i!=''


这句是不是有些多了。
@i>=0的情况下,这个判断条件始终成立的。



rucypli 2010-01-29
  • 打赏
  • 举报
回复
commit呢
  • 打赏
  • 举报
回复
[Quote=引用楼主 liujintaozyc 的回复:]
下面是我写一个过程  插入三个表中  我用到事务  大家看下我这样写有问题没  在性能和速度上是否需要修改
大家有什么好办法或建议没
ALTER proc [dbo].[pr_insertfwbuy](
@fm_title nvarchar(50),
@fm_sf int,
@fm_qy int,
@fm_dq int,
@fm_type int,
@fm_source int,
@fm_fwlx int,
@fm_price decimal(18, 0),
@fm_fwsm nvarchar(300),
@fm_mj int,
@fm_address nvarchar(50),
@fm_adduser int,
@u_name nvarchar(10),
@u_phone char(12),
@u_email char(30),
@u_qqmsn char(30),
@p_pathslt0 char(50),
@p_path0 char(50),
@p_pathslt1 char(50),
@p_path1 char(50),
@p_pathslt2 char(50),
@p_path2 char(50))
as
declare @fmid int;
begin tran--使用事务
--插入第一个表
insert into T_fwbuy(fm_title,fm_sf,fm_qy,fm_dq,fm_type,fm_source,fm_fwlx,fm_price,fm_fwsm,fm_mj,fm_address,fm_addtime,fm_endtime,fm_adduser,fm_enduser,fm_sfjs)
values(@fm_title,@fm_sf,@fm_qy,@fm_dq,@fm_type,@fm_source,@fm_fwlx,@fm_price,@fm_fwsm,@fm_mj,@fm_address,getdate(),getdate(),@fm_adduser,@fm_adduser,0)
select @fmid=@@identity;
--插入第二个表
insert into T_fwmmuser(u_newid,u_type,u_name,u_phone,u_email,u_qqmsn,u_addtime)
values(@fmid,@fm_type,@u_name,@u_phone,@u_email,@u_qqmsn,getdate());

declare @i int;
set @i=0
while @i <3
begin
if '@p_path'+@i!=null and '@p_path'+@i!=''
begin
--插入第三个表
insert into T_photo(P_type,p_newid,p_pathslt,p_path)
values(@fm_type,@fmid,'@p_pathslt'+@i,'@p_path'+@i)
end
set @i=@i+1;
end
rollback tran


[/Quote]

how can you commit the data?
--小F-- 2010-01-29
  • 打赏
  • 举报
回复
这样很不错了 学习

34,576

社区成员

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

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