2014-10-09 42 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'