Sql server 2008 存储过程在执行时返回-1

Sql server 2008 存储过程在执行时返回-1,sql-server-2008,stored-procedures,asp.net-mvc-5,Sql Server 2008,Stored Procedures,Asp.net Mvc 5,我在SQLServer2008中有一个存储过程。它将电子邮件作为参数,然后查找链接到它的用户是否有权访问移动MVC5应用程序。存储过程返回1或0。下面是存储过程的代码 -- Add the parameters for the stored procedure here @email varchar(128) AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering

我在SQLServer2008中有一个存储过程。它将电子邮件作为参数,然后查找链接到它的用户是否有权访问移动MVC5应用程序。存储过程返回1或0。下面是存储过程的代码

-- Add the parameters for the stored procedure here

    @email varchar(128)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

DECLARE @Check int

SELECT  

    @Check = (
                    SELECT P.MobileRights
                    FROM eMK_Person as P
                    WHERE P.ID = (SELECT FK_Person FROM eMK_contact WHERE eMK_Contact.Information = @Email)
                    )

IF (@Check is null) RETURN 0
RETURN (@Check)

END

GO
在AccountController的标准mvc5代码中,我对这个存储过程添加了一个简单的检查,如果结果为0,它应该只返回视图。以下是我添加到登录任务操作结果的代码:

var test = db.SP_MB_MobileRights(model.Email);
if (db.SP_MB_MobileRights(model.Email) == 0)
{
    return View(model);
}
我有两个测试帐户。有权利的人和没有权利的人。如果我在ManagementStudio中使用查询执行存储过程,它的工作方式与应该的一样,一个返回0,另一个返回1

但是当我调试代码时,测试变量总是被-1填充

下面是我在模型中添加存储过程时MVC为我编写的代码

public virtual int SP_MB_MobileRights(string email)
{
    var emailParameter = email != null ?
        new ObjectParameter("email", email) :
        new ObjectParameter("email", typeof(string));

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("SP_MB_MobileRights", emailParameter);
}
在调试时,我可以清楚地看到emailParameter变量中填充了电子邮件地址:


如果过程要返回1或0,请尝试将过程更改为:

AS
BEGIN
IF EXISTS (SELECT P.MobileRights FROM eMK_Person as P WHERE P.ID = (SELECT FK_Person FROM eMK_contact WHERE eMK_Contact.Information = @Email))
RETURN 1
ELSE
RETURN 0
END
您还应该将查询更改为
JOIN
,而不是子查询

比如:

SELECT P.MobileRights FROM eMK_Person as P  
     JOIN eMK_contact as C ON c.FK_Person = P.ID WHERE C.Information = @Email

如果过程要返回1或0,请尝试将过程更改为:

AS
BEGIN
IF EXISTS (SELECT P.MobileRights FROM eMK_Person as P WHERE P.ID = (SELECT FK_Person FROM eMK_contact WHERE eMK_Contact.Information = @Email))
RETURN 1
ELSE
RETURN 0
END
您还应该将查询更改为
JOIN
,而不是子查询

比如:

SELECT P.MobileRights FROM eMK_Person as P  
     JOIN eMK_contact as C ON c.FK_Person = P.ID WHERE C.Information = @Email


我已经编辑了你的标题。请看“”,其中的共识是“不,他们不应该”。啊,对不起,我想指出的是,当在MVC中执行时,过程返回-1,不确定如何执行。我会记住的,谢谢!但是这个过程不知道你是否在MVC中运行!我注意到你的大部分问题都是从标签开始的。请不要再这样做了,好吗?是的,很抱歉,从现在起我将不再这样做。请尝试此链接[[1]:我已编辑了您的标题。请参见“”,其中共识是“不,他们不应该”。啊,对不起,我想指出的是,当在MVC中执行时,该过程返回-1,但不确定如何执行。现在请记住,谢谢!但该过程不知道您是否在MVC中运行!我注意到您的大多数问题都是以标记开头的。请不要再这样做了,好吗?是的,对不起,我将避免这样做从现在开始。试试这个链接[[1]:我已经编辑了你的标题。请看“”,其中的共识是“不,他们不应该”。啊,对不起,我想指出的是,当在MVC中执行时,该过程返回-1,但不确定如何执行。现在请记住,谢谢!但该过程不知道您是否在MVC中运行!我注意到您的大多数问题都是以标记开头的。请不要再这样做了,好吗?是的,对不起,我将避免这样做从现在开始。请尝试此链接[[1]:我对SQL没有那么丰富的经验,如果这是一个愚蠢的问题,那么很抱歉,但是加入会有什么好处?@Robin这为你解释了。简而言之,使用加入通常更快。谢谢你提供的信息!我对SQL没有那么丰富的经验,如果这是一个愚蠢的问题,那么很抱歉,但是加入会有什么好处?@Robin这解释道这是给你的。简言之,使用连接通常更快。谢谢你提供的信息!我对SQL没有太多经验。如果这是一个愚蠢的问题,很抱歉,但是连接有什么好处?@Robin这为你解释了。简言之,使用连接通常更快。谢谢你提供的信息!