2014-10-09 46 views
0

我有這個存儲過程:如何在存儲過程中插入失敗時使存儲過程返回非零值?

CREATE PROCEDURE sp_purchase_test 
    @AdminTestId int, 
    @PurchaseDate DATETIME, 
    @UserId int 
AS  
INSERT INTO dbo.UserTest 
( 
    AdminTestId, 
    PurchaseDate, 
    UserId, 
    Sequence 
)   
SELECT AdminTestId, 
     @PurchaseDate, 
     @UserId, 
     1 
FROM AdminTest  
WHERE AdminTestId = @AdminTestId  
RETURN 0 

我有UserTest.AdminTestId唯一索引順序,從而有可能該存儲 程序將無法正常工作。如果插入失敗,如何使存儲過程返回非零值?

根據我的理解,使用TRY-CATCH可能是一個好主意。但是,如果我這樣做我應該做的是這樣的:

BEGIN CATCH 
    SELECT -1 
END CATCH 

BEGIN CATCH 
    RETURN 99 
END CATCH 

我是一個SELECT之間迷茫,在存儲過程的結束和使用或返回

這裏是如何我稱之爲存儲過程。理想情況下,我希望能夠從我的C#方法返回錯誤消息。

 var sql = @"dbo.sp_purchase_test @AdminTestId, 
              @PurchaseDate, 
              @UserId"; 
     SqlParameter[] parameters = new SqlParameter[] 
     { 
      new SqlParameter("@AdminTestId", adminTestId), 
      new SqlParameter("@PurchaseDate", DateTime.UtcNow), 
      new SqlParameter("@UserId", Int32.Parse(User.Identity.GetUserId())) 
     }; 
     var result = db.Database.ExecuteSqlCommand(sql, parameters); 
     await db.SaveChangesAsync(); 
     return Ok(); 
+2

作爲附帶說明['CREATE PROCEDURE'](http://msdn.microsoft.com/en -us/library/ms187926.aspx):「避免在命名過程中使用** sp _ **前綴,這個前綴被SQL Server用來指定系統過程,使用前綴可能會導致應用程序代碼中斷一個同名的系統程序「。 – 2014-10-09 07:25:43

+2

使用try catch http://msdn.microsoft.com/en-IN/library/ms175976.aspx – NMK 2014-10-09 07:26:46

+0

Try @@ RowCount(http://msdn.microsoft.com/en-us/library/ms187316.aspx)。最後看例子。 – NeverHopeless 2014-10-09 07:35:47

回答

1

可以使用輸出參數

CREATE PROCEDURE test 
@Value1 nvarchar(1), 
@Value2 nvarchar(1), 
@IsInserted bit output 
AS 
BEGIN 

BEGIN TRY 
    INSERT INTO [dbo].[table_name] 
      ([col_1] 
      ,[col_2]) 
    VALUES 
      (@Value1,@Value2) 
    SET @IsInserted=1 
END TRY 
BEGIN CATCH 
    SET @IsInserted=0 
END CATCH 

RETURN @IsInserted 

END 

執行步驟:

DECLARE @IsInserted bit 

EXEC [dbo].[test] 
     @Value1 = N'a', 
     @Value2 = N'b', 
     @IsInserted = @IsInserted OUTPUT 

SELECT @IsInserted as N'IsInserted'