2016-08-13 19 views
-1

我有這樣的表稱爲InspectionsReview故障排除實施SQL服務器觸發

CREATE TABLE InspectionsReview 
(
    ID int NOT NULL AUTO_INCREMENT, 
    InspectionItemId int, 
    SiteId int, 
    ObjectId int, 
    DateReview DATETIME, 
    PRIMARY KEY (ID) 
); 

這裏怎麼表如下:

+----+------------------+--------+-----------+--------------+ 
| ID | InspectionItemId | SiteId | ObjectId | DateReview | 
+----+------------------+--------+-----------+--------------+ 
| 1 | 3    | 3  | 3045  | 20-05-2016 | 
| 2 | 5    | 45 | 3025  | 01-03-2016 | 
| 3 | 4    | 63 | 3098  | 05-05-2016 | 
| 4 | 5    | 5  | 3041  | 03-04-2016 | 
| 5 | 3    | 97 | 3092  | 22-02-2016 | 
| 6 | 1    | 22 | 3086  | 24-11-2016 | 
| 7 | 9    | 24 | 3085  | 15-12-2016 | 
+----+------------------+--------+-----------+--------------+ 

我需要寫觸發新行插入之前檢查該表如果表已經有行的列值'ObjectId'和'DateReview'等於必須插入的行的列值,如果它是相等的我需要獲取退出行的ID並將其放入觸發變量稱爲duplicate

例如,如果具有將被插入新行是:

INSERT INTO InspectionsReview (InspectionItemId, SiteId, ObjectId, DateReview)] 
VALUES (4, 63, 3098, '05-05-2016'); 

在SQL Server觸發重複的變量必須是等於3

因爲在InspectionsReview表中的行分別爲ID = 3具有ObjectIdDateReview的值與新行中必須插入的值相同。我怎樣才能實現這個?

+0

什麼是id字段的數據類型?是它的身份? – TheGameiswar

+0

這部分也不清楚..「我想獲得該行的ID並把它放到觸發變量稱爲複製」你可以請示出樣本預期的輸出 – TheGameiswar

+0

對於這部分「我需要編寫觸發器,檢查之前新行插入到Inspections Review「,並且這個」如果是,我想獲取該行的ID並將其放入觸發變量稱爲重複「。如果您在插入前執行檢查**,那麼如何獲取要插入另一個表的ID? – DVT

回答

0

有了額外的假設,你想記錄所有的重複到不同的表,那麼我的解決方案是創建一個AFTER觸發器,它會檢查重複並將其插入到日誌表中。 當然,這是否是解決方案取決於我的額外假設是否有效。

這是我的日誌表。

CREATE TABLE dbo.InspectionsReviewLog (
    ID int 
    , ObjectID int 
    , DateReview DATETIME 
    , duplicate int 
); 

這裏是觸發(用額外的假設很簡單)

CREATE TRIGGER tr_InspectionsReview 
ON dbo.InspectionsReview 
AFTER INSERT 
AS 
BEGIN 
    DECLARE @tableVar TABLE(
     ID int 
     , ObjectID int 
     , DateReview DATETIME 
    ); 

    INSERT INTO @tableVar (ID, ObjectID, DateReview) 
    SELECT DISTINCT inserted.ID, inserted.ObjectID, inserted.DateReview 
    FROM inserted 
     JOIN dbo.InspectionsReview ir ON inserted.ObjectID=ir.ObjectID AND inserted.DateReview=ir.DateReview AND inserted.ID <> ir.ID; 

    INSERT INTO dbo.InspectionsReviewLog (ID, ObjectID, DateReview, duplicate) 
    SELECT ID, ObjectID, DateReview, 3 
    FROM 
     @tableVar; 


END;