2016-04-18 6 views
2

Ich habe die folgende Tabelle:Update-Trigger von select-Anweisung Schleife

 
SystemList 

System Value1 Value2 Value3 Value4 Total 

System1 10    30  40 
System2   20 
System3 10    30 
System4   30    40 

ich folgendes in einem Trigger haben, das funktioniert gut, aber ich möchte durch jedes der Systeme zu durchlaufen und die Summe jeder Zeile aktualisieren, ohne dies in Wirklichkeit 92 Mal tun müssen. Gibt es eine Möglichkeit, die Systeme zu durchsuchen und die Werte in dieser Zeile zu summieren, wenn ein Einfügen oder Aktualisieren durchgeführt wird?

Use Database 

UPDATE dbo.SystemList 
SET Total = (SELECT (COALESCE(Value1, 0) + COALESCE(Value2, 0) + COALESCE(Value3, 0) + COALESCE(Value4, 0)) AS Total 
       FROM dbo.SystemList where System = 'System1') Where System = 'System1' 

UPDATE dbo.SystemList 
SET Total = (SELECT (COALESCE(Value1, 0) + COALESCE(Value2, 0) + COALESCE(Value3, 0) + COALESCE(Value4, 0)) AS Total 
      FROM dbo.SystemList where System = 'System2') Where System = 'System2' 

UPDATE dbo.SystemList 
SET Total = (SELECT (COALESCE(Value1, 0) + COALESCE(Value2, 0) + COALESCE(Value3, 0) + COALESCE(Value4, 0)) AS Total 
      FROM dbo.SystemList where System = 'System3') Where System = 'System3' 

UPDATE dbo.SystemList 
SET Total = (SELECT (COALESCE(Value1, 0) + COALESCE(Value2, 0) + COALESCE(Value3, 0) + COALESCE(Value4, 0)) AS Total 
      FROM dbo.SystemList where System = 'System4') Where System = 'System4' 

Mein eigentlicher Auslöser ist:

USE [Database] 
GO 

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER TRIGGER [dbo].[Total] 
    ON [dbo].[SystemList] 
    AFTER INSERT,UPDATE 
AS 

Begin 

UPDATE dbo.SystemList 
SET Total = (SELECT (COALESCE(Value1, 0) + COALESCE(Value2, 0) + COALESCE(Value3, 0) + COALESCE(Value4, 0)) AS Total 
       FROM dbo.SystemList where System = 'System1') Where System = 'System1' 

UPDATE dbo.SystemList 
SET Total = (SELECT (COALESCE(Value1, 0) + COALESCE(Value2, 0) + COALESCE(Value3, 0) + COALESCE(Value4, 0)) AS Total 
      FROM dbo.SystemList where System = 'System2') Where System = 'System2' 

UPDATE dbo.SystemList 
SET Total = (SELECT (COALESCE(Value1, 0) + COALESCE(Value2, 0) + COALESCE(Value3, 0) + COALESCE(Value4, 0)) AS Total 
      FROM dbo.SystemList where System = 'System3') Where System = 'System3' 

UPDATE dbo.SystemList 
SET Total = (SELECT (COALESCE(Value1, 0) + COALESCE(Value2, 0) + COALESCE(Value3, 0) + COALESCE(Value4, 0)) AS Total 
      FROM dbo.SystemList where System = 'System4') Where System = 'System4' 

End 

Antwort

3

Sie müssen nicht jeden Wert in einer separaten Abfrage angeben, wie Sie tun. Dies wäre einfacher.

UPDATE dbo.SystemList SET Total = COALESCE(Value1, 0) + COALESCE(Value2, 0) + COALESCE(Value3, 0) + COALESCE(Value4, 0)) 

Oder Sie können dies noch einfacher tun. Verwenden Sie stattdessen eine berechnete Spalte in Ihrer Tabelle, und Sie benötigen nicht einmal einen Trigger.

Alter TABLE SystemList 
    Add Total as isnull(Value1, 0) + isnull(Value2, 0) + isnull(Value3, 0) + isnull(Value4, 0) 

https://msdn.microsoft.com/en-us/library/ms188300.aspx

+0

Die erste Methode funktioniert hat, gab die zweite mir sehr seltsame Werte. Es scheint zu funktionieren, wenn es nur einen Wert in einer Spalte gibt, aber nicht, wenn es einen Wert in mehreren Spalten gibt. – pinchetpooche