高手帮忙看下这个存储过程

tsongjb 2009-11-26 04:03:40
我是想实现主表和子表的同时插入,如果得到主表的插入ID就根据这个ID给字表插入信息,我想问,commit为什么没起作用?

create proc pro_insertOrder @tableName varchar(32)=null,@childTableName varchar(32)=null,@values nvarchar(200)=null,@childValues nvarchar(200) = null
as
declare @result int
declare @parameter varchar(200)
if @tableName is null or @childTableName is null or @values is null or @childValues is null
begin
return -1
end
begin
exec('insert into ' + @tableName + ' values(' + @values + ')')
select @result = @@IDENTITY
end
if @result is not null
begin
select @parameter = 'insert into '+ @childTableName +' values('+ CAST(@result as varchar) + @childValues+')'
print @parameter
execute @parameter
end
else
begin
commit transaction
return 0
end
go
...全文
151 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
tsongjb 2009-11-26
  • 打赏
  • 举报
回复
搞定了,结贴闪人!! 这是一个很有用的主子表同时插入的存储过程! 嘿嘿,就放这了,希望对大家有帮助!

create proc pro_insertOrder @tableName varchar(32)=null,@childTableName varchar(32)=null,@values nvarchar(200)=null,@childValues nvarchar(200) = null
as
declare @result int
declare @parameter varchar(200)
if @tableName is null or @childTableName is null or @values is null or @childValues is null
begin
return -1
end
SET XACT_ABORT ON
begin tran
begin
exec('insert into ' + @tableName + ' values(' + @values + ')')
select @result = @@IDENTITY
end
if @result is not null
begin
select @parameter = 'insert int '+ @childTableName +' values('+ CAST(@result as varchar) +','+ @childValues+')'
--print @parameter
execute (@parameter)
if @@ERROR = 0
begin
commit tran
end
else
begin
rollback tran
end
end
else
begin
return 0
end
go
tsongjb 2009-11-26
  • 打赏
  • 举报
回复
不行的哦,高手给改改!
kasin000 2009-11-26
  • 打赏
  • 举报
回复
提交放错地方,而且每有rollback
icelovey 2009-11-26
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 sytdeedee 的回复:]
引用 8 楼 tsongjb 的回复:
如果没有得到的话,这个插入操作就取消,两张表都不插入,如果插入就一起插入,我commit用的不好
请高手给改改,在这里先谢过!


那应该是这样吧
SQL codeCREATEPROC pro_insertOrder@tableNameVARCHAR(32)=NULL,@childTableNameVARCHAR(32)=NULL,@valuesNVARCHAR(200)=NULL,@childValuesNVARCHAR(200)=NULLASDECLARE@resultINTDECLARE@parameterVARCHAR(200)IF@tableNameISNULLOR@childTableNameISNULLOR@valuesISNULLOR@childValuesISNULLBEGINRETURN-1ENDBEGINTRANSACTION--事务开始BEGINEXEC ('insert into'+@tableName+' values('+@values+')')SELECT@result=@@IDENTITYENDIF@resultISNOTNULLBEGINSELECT@parameter='insert into'+@childTableName+' values('+CAST(@resultASVARCHAR)+@childValues+')'PRINT@parameterEXECUTE@parameterCOMMITTRANSACTION--子表也插入就提交ENDELSEBEGINROLLBACKTRANSACTION--如果主表没插入则回滚RETURN0ENDGO
[/Quote]

UP
sytdeedee 2009-11-26
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 tsongjb 的回复:]
如果没有得到的话,这个插入操作就取消,两张表都不插入,如果插入就一起插入,我commit用的不好
请高手给改改,在这里先谢过!
[/Quote]

那应该是这样吧

CREATE PROC pro_insertOrder @tableName VARCHAR(32) = NULL,@childTableName
VARCHAR(32) = NULL,@values NVARCHAR(200) = NULL,@childValues NVARCHAR(200) =
NULL
AS
DECLARE @result INT
DECLARE @parameter VARCHAR(200)
IF @tableName IS NULL
OR @childTableName IS NULL
OR @values IS NULL
OR @childValues IS NULL
BEGIN
RETURN -1
END


BEGIN TRANSACTION --事务开始

BEGIN
EXEC ('insert into ' + @tableName + ' values(' + @values + ')')
SELECT @result = @@IDENTITY
END

IF @result IS NOT NULL
BEGIN
SELECT @parameter = 'insert into ' + @childTableName + ' values(' + CAST(@result AS VARCHAR)
+ @childValues + ')'

PRINT @parameter
EXECUTE @parameter
COMMIT TRANSACTION --子表也插入就提交
END
ELSE
BEGIN
ROLLBACK TRANSACTION --如果主表没插入则回滚
RETURN 0
END
GO
tsongjb 2009-11-26
  • 打赏
  • 举报
回复
如果没有得到的话,这个插入操作就取消,两张表都不插入,如果插入就一起插入,我commit用的不好
请高手给改改,在这里先谢过!
sytdeedee 2009-11-26
  • 打赏
  • 举报
回复
不太明白你想做什么,能说详细点吗? 如果没有得到插入主表的ID为什么就要COMMIT
icelovey 2009-11-26
  • 打赏
  • 举报
回复
楼主你既然有COMMIT, 可是为什么没看见BEGIN TRANS呢??
忆轩辕 2009-11-26
  • 打赏
  • 举报
回复
提交事务
sytdeedee 2009-11-26
  • 打赏
  • 举报
回复
你加commit transaction的目的是什么
--小F-- 2009-11-26
  • 打赏
  • 举报
回复
不懂 帮顶
tsongjb 2009-11-26
  • 打赏
  • 举报
回复
再顶!!!
tsongjb 2009-11-26
  • 打赏
  • 举报
回复
自己顶个先!!!!

22,299

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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