2014-09-25 57 views
-1

我在SQL Server 我必須代碼初學者解決方案是,嵌套插入使用承諾和SQL Server回滾兩個表2008

我有兩個表。我使用存儲過程將記錄插入到這些表中。存儲過程具有輸入參數,如@name@age@firstname@lastname

我必須將@name@age插入第一個表(如果條件年齡> 18)。和@firstname@lastname@age到第二表(如果條件年齡> 20)。

如果任何條件或插入失敗的方式,所有的變化應該否則提交回滾應該發生。

我的問題是隻有在所有時間都引發外部catch catch塊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 

此處還指出​​任何不必要的代碼。

在此先感謝。

+0

@MitchWheat對不起,我不能讓你。其實我沒有在這裏使用任何觸發器。 – Vanjith 2014-09-25 10:31:44

+0

我的意思是使用檢查約束,而不是一個過程,對不起。 – 2014-09-25 10:59:30

+0

好米奇小麥。但我有條件使用存儲過程只有:-(。 – Vanjith 2014-09-25 12:42:51

回答

1

林不知道這個代碼。只是嘗試。

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