我是想实现主表和子表的同时插入,如果得到主表的插入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

解决方案 »

  1.   

    你加commit transaction的目的是什么  
      

  2.   

    楼主你既然有COMMIT, 可是为什么没看见BEGIN TRANS呢??
      

  3.   

    不太明白你想做什么,能说详细点吗? 如果没有得到插入主表的ID为什么就要COMMIT
      

  4.   

    如果没有得到的话,这个插入操作就取消,两张表都不插入,如果插入就一起插入,我commit用的不好
    请高手给改改,在这里先谢过!
      

  5.   


    那应该是这样吧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
      

  6.   

    提交放错地方,而且每有rollback
      

  7.   

    搞定了,结贴闪人!! 这是一个很有用的主子表同时插入的存储过程! 嘿嘿,就放这了,希望对大家有帮助!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