Sql 返回零而不是值

Sql 返回零而不是值,sql,sql-server,Sql,Sql Server,问题:PassedPercent返回0,但在所有情况下,@Started和@Passed都有数值,应该有一个数字我可以确认。相同的公式在.aspx页面上正常工作,但我将其转换为SQL查询 代码: 在本例中,int/int将返回一个int,即零 试一试 在本例中,int/int将返回一个int,即零 试一试 @indofraiser当@PassedCheers时,你问题中的公式将始终返回0,我刚刚删除了我的其他评论,正要问你给出的答案@如果你尝试一下,你可能会感到惊讶。例如,try:选择25/10

问题:PassedPercent返回0,但在所有情况下,@Started和@Passed都有数值,应该有一个数字我可以确认。相同的公式在.aspx页面上正常工作,但我将其转换为SQL查询

代码:


在本例中,int/int将返回一个int,即零

试一试


在本例中,int/int将返回一个int,即零

试一试


@indofraiser当@PassedCheers时,你问题中的公式将始终返回0,我刚刚删除了我的其他评论,正要问你给出的答案@如果你尝试一下,你可能会感到惊讶。例如,try:选择25/100,然后尝试选择25.0/100。第一个值将返回零,而第二个值将返回0.25,因此两个值都是整数。系统必须为结果返回1且仅返回一种数据类型。因为它的两个值是整数,所以它使用int,所以得到0。如果仅通过添加.0将1更改为十进制,引擎将选择精度最高的值,并返回一个十进制。或者,您可以在除法发生之前将每个值转换为十进制。在SQLServer中,这种情况通常被称为整数数学,您需要始终注意它。我不相信在Oracle、MySQL或DB2中会发生这种情况。@indofraiser当@PassedCheers时,您问题中的公式将始终返回0,我刚刚删除了我的其他注释,并准备询问您给出的答案@如果你尝试一下,你可能会感到惊讶。例如,try:选择25/100,然后尝试选择25.0/100。第一个值将返回零,而第二个值将返回0.25,因此两个值都是整数。系统必须为结果返回1且仅返回一种数据类型。因为它的两个值是整数,所以它使用int,所以得到0。如果仅通过添加.0将1更改为十进制,引擎将选择精度最高的值,并返回一个十进制。或者,您可以在除法发生之前将每个值转换为十进制。在SQLServer中,这种情况通常被称为整数数学,您需要始终注意它。我不相信在Oracle、MySQL或DB2中会发生这种情况。零是一个数字。@jarlh,但只在足够大的值0上发生pZero是一个数字。@jarlh,但仅限于足够大的值0:P
USE DATABASE

DECLARE @i INT = 0 
DECLARE @ModuleID  bigint
DECLARE @Started   bigint
DECLARE @Completed  bigint
DECLARE @Passed  bigint

DECLARE merge_cursor CURSOR FAST_FORWARD FOR SELECT [ModuleID] FROM dbo.[TblModules] 
--ORDER BY [ModuleID]
OPEN merge_cursor

FETCH NEXT FROM merge_cursor INTO @ModuleID

WHILE @@FETCH_STATUS = 0
BEGIN

    SET @Started =  (Select Count(ID) FROM [TblResults] WHERE [ModuleID] = @ModuleID) 
    SET @Completed = (Select Count(ID) FROM [TblResults] WHERE [ModuleID] = @ModuleID and ModuleDatecomplete <> '')
    SET @Passed = (Select Count(ID) FROM [TblResults] WHERE [ModuleID] = @ModuleID and Pass = 'Yes')

    UPDATE [TblModules]  SET [Started] = @Started,[Completed] = @Completed,[Passed] = @Passed,[PassedPercent] = ((@Passed / @Started) * 100)
    WHERE [ModuleID] = @ModuleID     

    FETCH NEXT FROM merge_cursor INTO @ModuleID 
END

CLOSE merge_cursor
DEALLOCATE merge_cursor 
 ,[PassedPercent] = (@Passed *100.0) / @Started