2016-08-25 2 views
1

Angenommen, ich habe die folgende Tabelle T1:Summe alle eingegebenen Werte in Trigger-

| type | col1 | col2 | 
|------|------|------| 
| abc | 0 | 0 | 
| def | 0 | 3 | 
| abc | 3 | 123 | 
| def | 0 | 5 | 
| def | 2 | 4 | 

Von Zeit zu Zeit einige neue Werte in T1 eingefügt werden. Ich möchte nun einen Trigger erstellen, der eine andere Tabelle T2 auffüllt, je nach den T1 eingetragenen Werten.

die Werte in T2 einfügen kann mit dem folgenden Pseudocode berechnet werden:

IF col1 = 0 AND col2 = 0 
    A++ 
ELSE IF col1 = 0 col2 > 0 
    B++ 
ELSE IF col1 > 0 
    C++ 

I bereits die folgenden Trigger erstellt:

Create TRIGGER TRI1 
    ON dbo.T1 
    FOR INSERT 
AS 
BEGIN 
    INSERT INTO dbo.T2 
    SELECT Sum(CASE WHEN col1 = 0 AND col2 = 0 THEN 1 END) as 'A', 
      Sum(CASE WHEN col1 = 0 AND col2 > 0 THEN 1 END) as 'B', 
      Sum(CASE WHEN col1 > 0 THEN 1 END) as 'C' 
    FROM INSERTED 
END 

Als ich es mit Test:

bekomme ich folgende Ausgabe:

| A | B | C | 
|------|------|------| 
| NULL | NULL | 1 | 
| 1 | NULL | NULL | 
| NULL | 1 | NULL | 
| 1 | NULL | NULL | 

Aber die erwartete Ausgabe ist nur 1 Zeile pro Einfügevorgang:

| A | B | C | 
|---|---|---| 
| 2 | 1 | 1 | 
+3

'INSERT INTO dbo.T1 WERTE ('abc', 2,3), ('abc', 0,0), ... 'eine Operation. 'einfügen in ...; einfügen in ...; '- zwei – Mike

+1

Yeap .... Ihr Code tut genau das, was es soll. Es erzeugt 1 Reihe für jeden Einsatz. Gibt es etwas anderes, was du erwartest? Oder müssen Sie mehrere Zeilen in eine einzige insert-Anweisung einfügen, um dies zu testen? –

+0

Sie haben 4 einfügen, so dass Sie 4 verschiedene Operationen haben, und eine Zeile por einfügen Operation. Das Verhalten ist in Ordnung. –

Antwort

1

Sie einen Auslöser wie diese schaffen sollte,

CREATE TRIGGER TRI1 ON dbo.T1 
FOR INSERT 
AS 
BEGIN 
    IF EXISTS (
      SELECT 1 
      FROM dbo.T2 
      ) 
    BEGIN 
     UPDATE T 
     SET A = Sum(CASE 
        WHEN T.col1 = 0 
         AND T.col2 = 0 
         THEN 1 
        ELSE 0 
        END) 
      ,B = Sum(CASE 
        WHEN T.col1 = 0 
         AND T.col2 > 0 
         THEN 1 
        ELSE 0 
        END) 
      ,C = Sum(CASE 
        WHEN T.col1 > 0 
         THEN 1 
        ELSE 0 
        END) 
     FROM dbo.t1 T 
    END 
    ELSE 
    BEGIN 
     INSERT INTO dbo.T2 
     SELECT Sum(CASE 
        WHEN T.col1 = 0 
         AND T.col2 = 0 
         THEN 1 
        ELSE 0 
        END) AS 'A' 
      ,Sum(CASE 
        WHEN T.col1 = 0 
         AND T.col2 > 0 
         THEN 1 
        ELSE 0 
        END) AS 'B' 
      ,Sum(CASE 
        WHEN T.col1 > 0 
         THEN 1 
        ELSE 0 
        END) AS 'C' 
     FROM dbo.t1 T 
    END 
END