Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 为什么存储过程返回0?_Sql Server_Tsql_Stored Procedures - Fatal编程技术网

Sql server 为什么存储过程返回0?

Sql server 为什么存储过程返回0?,sql-server,tsql,stored-procedures,Sql Server,Tsql,Stored Procedures,我正在尝试获取PointsNeed列和pointsPossible列的总和。我想把这个变成一个百分比。我的问题是,我的SP始终返回0,即使有具有给定的enrollmentId的行具有前几列的值 我做错了什么 ALTER PROCEDURE GetPercentage @enrollmentId int AS BEGIN DECLARE @pointsEarned int; DECLARE @pointsPossible int; SET NOCOUNT ON;

我正在尝试获取
PointsNeed
列和
pointsPossible
列的总和。我想把这个变成一个百分比。我的问题是,我的SP始终返回0,即使有具有给定的
enrollmentId
的行具有前几列的值

我做错了什么

ALTER PROCEDURE GetPercentage 
    @enrollmentId int
AS
BEGIN
    DECLARE @pointsEarned int;
    DECLARE @pointsPossible int;

    SET NOCOUNT ON;

    SELECT 
        @pointsEarned = CAST(SUM(pointsEarned) OVER() AS decimal), 
        @pointsPossible = CAST(SUM(pointsPossible) OVER() AS decimal)
    FROM 
        Assignments
    WHERE 
        enrollmentId = @enrollmentId

    RETURN @pointsEarned / @pointsPossible
END
GO
这是数据库表:


我执行存储过程并传入69的
enrollmentId
,它仍然返回0。

分母(
pointspobable
)大于分子(
pointsEarned
)的整数除法返回零

写为(修订):


正如@Nick.McDermaid指出的,由于此过程返回标量值,因此将其定义为函数而不是存储过程可能更为合适。

分母(
点可能
)大于分子(
点搜索
)的整数除法返回零

写为(修订):

正如@Nick.McDermaid指出的,由于此过程返回标量值,因此将其定义为函数而不是存储过程可能更合适

  • 使用简单的
    SUM
    而不使用
    OVER

  • RETURN
    只能返回
    int
    。如果百分比小于100%,整数除法将始终返回0,因此乘以100将返回整个百分比,而不是比率

  • 检查你没有被零除

  • 程序

    ALTER PROCEDURE GetPercentage 
        @enrollmentId int
    AS
    BEGIN
        SET NOCOUNT ON;
    
        DECLARE @pointsEarned int;
        DECLARE @pointsPossible int;
    
        SELECT 
            @pointsEarned = SUM(pointsEarned),
            @pointsPossible = SUM(pointsPossible)
        FROM 
            Assignments
        WHERE 
            enrollmentId = @enrollmentId
        ;
    
        RETURN 
            CASE WHEN @pointsPossible <> 0
            THEN 100 * @pointsEarned / @pointsPossible
            ELSE 0 END;
    
    END
    GO
    
    ALTER过程获取百分比
    @注册ID int
    作为
    开始
    不计数;
    声明@pointsEarned int;
    声明@pointspobable int;
    挑选
    @pointsEarned=总和(pointsEarned),
    @pointsPossible=总和(pointsPossible)
    从…起
    作业
    哪里
    enrollmentId=@enrollmentId
    ;
    返回
    @points可能为0时的大小写
    然后100*@pointserned/@points可能
    否则0结束;
    结束
    去
    
  • 使用简单的
    SUM
    而不使用
    OVER

  • RETURN
    只能返回
    int
    。如果百分比小于100%,整数除法将始终返回0,因此乘以100将返回整个百分比,而不是比率

  • 检查你没有被零除

  • 程序

    ALTER PROCEDURE GetPercentage 
        @enrollmentId int
    AS
    BEGIN
        SET NOCOUNT ON;
    
        DECLARE @pointsEarned int;
        DECLARE @pointsPossible int;
    
        SELECT 
            @pointsEarned = SUM(pointsEarned),
            @pointsPossible = SUM(pointsPossible)
        FROM 
            Assignments
        WHERE 
            enrollmentId = @enrollmentId
        ;
    
        RETURN 
            CASE WHEN @pointsPossible <> 0
            THEN 100 * @pointsEarned / @pointsPossible
            ELSE 0 END;
    
    END
    GO
    
    ALTER过程获取百分比
    @注册ID int
    作为
    开始
    不计数;
    声明@pointsEarned int;
    声明@pointspobable int;
    挑选
    @pointsEarned=总和(pointsEarned),
    @pointsPossible=总和(pointsPossible)
    从…起
    作业
    哪里
    enrollmentId=@enrollmentId
    ;
    返回
    @points可能为0时的大小写
    然后100*@pointserned/@points可能
    否则0结束;
    结束
    去
    
    我会放弃返回并用select替换它show your
    exec
    script为什么要放弃返回并用
    select替换?它无法解决问题,并完全改变了SP的使用。在您的示例中,您希望得到什么结果?我会去掉返回值并用SELECTshow your
    exec
    script替换它。为什么要去掉返回值并用
    select
    替换?它没有解决问题,完全改变了SP的使用。您希望在您的示例中得到什么结果?@MitchWheat,我想我知道
    SUM()OVER()
    的作用。如果我正确理解这个问题,OP需要一个简单的和(一行一个数字),而不是多行的和。你的意思是像我发布的答案一样?但是关于返回的好观点只能返回一个整数。@MitchWheat,是的,你的答案和我的非常相似。您决定
    选择结果作为结果集,该结果集可以保存非整数值(
    十进制
    浮点
    )。我离开了原始方法,
    返回
    整数值。顺便说一句,没有必要使用
    groupby
    ,因为
    WHERE
    中有过滤器。RE:groupby:“是的,我知道。这是出于习惯。@MitchWheat,我想我知道
    SUM()OVER()
    的作用。如果我正确理解这个问题,OP需要一个简单的和(一行一个数字),不是多行的总和。你的意思是像我发布的答案一样吗?但是返回的好方法只能返回一个整数。@MitchWheat,是的,你和我的答案非常相似。你决定选择结果作为结果集,结果集可以保存非整数值(
    decimal
    float
    ).我保留了原始方法,该方法返回整数值。
    。顺便说一句,没有必要使用
    分组依据
    ,因为在
    中有过滤器。RE:GROUP BY”:是的,我知道。这是出于习惯。