2016-08-25 129 views
1

想,我有如下表T1總和觸發所有插入的值

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

定期,一些新的值插入到T1。我現在想要創建一個觸發器,其中填充另一個表T2,取決於值插入T1

插入到T2的值可以使用下面的僞碼計算:

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

我已經創建了以下觸發:

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 

當我與測試:

INSERT INTO dbo.T1 VALUES ('abc',2,3) 
INSERT INTO dbo.T1 VALUES ('abc',0,0) 
INSERT INTO dbo.T1 VALUES ('def',0,3) 
INSERT INTO dbo.T1 VALUES ('abc',0,0) 

我得到以下輸出:

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

但預期產量爲插入操作只有1行:

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

'INSERT INTO dbo.T1 VALUES('abc',2,3),('abc',0,0)......一次操作。 「插入......;插入...;' - 兩個 – Mike

+1

Yeap ....你的代碼完全按照它應該做的。它爲每個插入產生1行。你期望有什麼不同嗎?或者你是否需要在單個插入語句中插入多行來測試它? –

+0

你有4個插入,所以你有4個不同的操作,以及一個行插入操作。行爲是好的。 –

回答

1

您應該創建這樣一個觸發,

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