在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()
函数,但这没有任何区别。我该怎么办?
答案 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
你的触发器。