十进制自动舍入

时间:2018-03-13 09:20:48

标签: sql-server visual-studio

在Visual Studio中的SQL Server数据库中,我有一个触发器trgAfterUpdateAndInsertTeam,当我在Team表中插入一个新行时执行该触发器:

CREATE TRIGGER [dbo].[trgAfterUpdateAndInsertTeam]
ON Team
FOR INSERT
AS
    DECLARE @scoreperturn DECIMAL(6,3) = 0,
            @winlossratio DECIMAL(6,3) = 0,
            @idTeam INT = 0;

BEGIN
    /* Get data */
    SELECT
        @scoreperturn = [Score] / [Turns], 
        @winlossratio = [Wins] / [Losses], 
        @idTeam = [idTeam]
    FROM
        inserted

    /* Update data */
    UPDATE TEAM
    SET [ScorePerTurn] = ROUND(@scoreperturn, 3),
        [WinLossRatio] = ROUND(@winlossratio, 3)
    WHERE [idTeam] = @idTeam
END

表中的输出是十进制数,该列也是小数。但它会自动舍入。因此,当我应该有像3.421这样的输出时,它会在表中变为3.000。我尝试使用和不使用ROUND()函数,但这没有任何区别。我该怎么办?

1 个答案:

答案 0 :(得分:2)

@marc_s是完全正确的,这个触发器会给你带来麻烦。如果您在表格中INSERT 2(或更多)行,则只会更新填充变量的团队。

使用“计算”​​列并对触发器进行分级会更好。类似的东西:

ALTER TABLE Team DROP COLUMN ScorePerTurn; --You'll need to drop the column first
ALTER TABLE Test ADD ScorePerTurn AS CONVERT(Decimal(6,3),CONVERT(Decimal(6,3),[Score]) / [Turns]); --Then add it again as a Computer Column.
--Then do the same for the other column
ALTER TABLE Team DROP COLUMN WinLossRatio;
ALTER TABLE Test ADD WinLossRatio AS CONVERT(Decimal(6,3),CONVERT(Decimal(6,3),[Wins]) / [Losses]);

不要忘记DROP你的触发器。