-1

我是 sql server 的初学者,我必须编写代码来解决这种情况,

我有两张桌子。我正在使用存储过程将记录插入这些表中。存储过程具有输入参数,例如@name、和。@age@firstname@lastname

我必须插入@name@age一个表(如果条件年龄> 18)。和@firstname,@lastname@age进入第二个表(如果条件年龄 > 20)。

如果任何条件或插入失败意味着所有更改都应回滚,否则应发生提交。

我的问题只是外部捕获块 raiserror 只在所有时间提出。

这是我的代码。

ALTER PROCEDURE [dbo].[sample]
   @name varchar(10),
   @age int,
   @fn varchar(10),
   @ln varchar(10)
AS
BEGIN
    Declare @errormsg NVARCHAR(4000), @errormsg2 NVARCHAR(4000)


    BEGIN TRY
       IF(@age > 18)
       BEGIN
           BEGIN TRANSACTION 
                insert into employee 
                values(@name, @age)

                begin try
                   if(@age > 20)
                   begin
                      begin transaction
                          insert into empdet 
                          values(@fn, @ln, @age)

                          commit
                   end  
                   else
                   begin
                       RAISERROR (@errormsg2, 16, 1);
                   end
                end try
                begin catch
                    IF @@TRANCOUNT > 0
                    begin
                         ROLLBACK
                    end

                    SET @errormsg2 = 'inner catch Error:Age is less than 20'
                    RAISERROR (@errormsg2, 16, 1);
                end catch   

                COMMIT
            END
            ELSE 
            BEGIN
                RAISERROR (@errormsg, 16, 1);
            END             
        end try
        BEGIN CATCH
            IF @@TRANCOUNT > 0
            begin
                ROLLBACK
            end 

            SELECT @errormsg = 'Outer catch Error:Age is less than 18 '+cast(@age as varchar);
            RAISERROR (@errormsg, 16, 1);
        END CATCH
    END

还要在这里指出任何不必要的代码。

提前致谢。

4

1 回答 1

2

我不确定这段代码。试试吧。

ALTER PROCEDURE [dbo].[sample]
@name varchar(10),
@age int,
@fn varchar(10),
@ln varchar(10),
AS
BEGIN
Declare @errormsg NVARCHAR(4000), @errormsg2 NVARCHAR(4000),
        @stmt1 varchar(1000), @stmt2 varchar(1000), @stmt3 varchar(1000),
        @stmt4 varchar(1000)    

BEGIN TRY
   IF(@age > 18)
   BEGIN
       BEGIN TRANSACTION 
            insert into employee 
            values(@name, @age)

            begin try
               if(@age > 20)
               begin
                  begin transaction
                      insert into empdet 
                      values(@fn, @ln, @age)

                      commit                           
               end  


               else
               begin
                   RAISERROR (@errormsg2, 16, 1);
                   ROLLBACK
               end
               End try
            COMMIT
               begin catch
                SET @errormsg2 = 'inner catch Error:Age is less than 20'
                RAISERROR (@errormsg2, 16, 1);
             end catch   


        END
        ELSE 
        BEGIN
            RAISERROR (@errormsg, 16, 1);
        END             
    END TRY
    BEGIN CATCH
        SELECT @errormsg = 'Outer catch Error:Age is less than 18 '+cast(@age       varchar);
        RAISERROR (@errormsg, 16, 1);
    END CATCH
END
于 2014-09-25T12:02:03.527 回答