使用Entity Framework,我应该在我的存储过程中使用RETURN还是SELECT?

我目前正在尝试使用Entity Framework的存储过程,我遇到了返回类型的问题。

我的存储过程的返回类型是BIT。

这是我的存储过程的代码(简化):

CREATE PROCEDURE [dbo].[sp_makeStuff] @id int AS BEGIN DECLARE @status BIT BEGIN TRY BEGIN TRANSACTION DELETE FROM MyTable WHERE Id = @id SET @status = 1 COMMIT END TRY BEGIN CATCH SET @status = 0 ROLLBACK END CATCH RETURN @status END END 

我在我的.edmx文件中添加了sp_makeStuff,返回类型为bool?。

然后,我尝试使用下面的代码执行它

 using (var ctx = new MyEntities()) { ObjectResult result = ctx.sp_makeStuff(id); if (result.FirstOrDefault().Value) { // Stuff } } 

但是,它引发了System.Data.EntityCommandExecutionException类型的exception,其消息是“商店数据提供程序返回的数据读取器没有足够的列用于请求的查询”。

经过一番调查,我发现如果我更换它会有效

 RETURN @status 

通过

 SELECT @status 

在过去,我总是使用T-SQL“RETURN”关键字来返回这样的结果。

我想知道我的新实现是否正确。 因为我想在我的项目中使用EF,是否有意义使其与“RESULT”一起使用或者我必须明确地使用“SELECT”?

谢谢。

编辑24/10/2014

根据下面的回答,我重新编写了我的存储过程。 如果出现问题,它会引发错误而不是返回某些内容。

 CREATE PROCEDURE [dbo].[sp_makeStuff] @id int AS BEGIN BEGIN TRY BEGIN TRANSACTION DELETE FROM MyTable WHERE Id = @id COMMIT END TRY BEGIN CATCH ROLLBACK RAISERROR('Delete failed', 16, -1) END CATCH END END 

然后,我告诉EF我的存储过程什么都不返回,如果调用RAISERROR,我会处理exception。

 try { ctx.sp_web_DeleteElement(elementId); // ... } catch (Exception e) // Message in e.InnerException.Message { // ... } 

在过去,我总是使用T-SQL“RETURN”关键字来返回这样的结果。

存储过程返回码只能是整数。 其目的是指示调用应用程序的成功或失败,而不是返回数据。 使用OUTPUT参数或结果集返回数据。

返回值约定是零表示成功,错误/警告不为零。 非零值还可用于指示特定原因(例如,在更新尝试期间未找到客户的99)作为引发错误的替代方案。 默认情况下,如果引发任何严重性为10或更高的错误,SQL Server将返回负值。