T-SQL - Вставить триггер; ЕСЛИ СУЩЕСТВУЕТ, не оценивая как задумано - PullRequest
0 голосов
/ 02 июля 2018

Не уверен, что мне не хватает. Когда я отлаживаю и выполняю запрос INSERT, который я включил ниже, я вижу, что '%a%' - это значение @Answer, а 103 - это значение @ItemId.

.

IF EXISTS всегда оценивается как ложное, когда я вставляю значения, показанные ниже:

CREATE TRIGGER TR_cc_Additional_Information_Answers_INS 
ON cc_Additional_Information_Answers
AFTER INSERT 
AS
BEGIN
    CREATE TABLE temp_answers 
    (
         TempAnswer VARCHAR(50), 
         TempAdditional_Information_ItemID INT
    )

    INSERT INTO temp_answers (TempAnswer, TempAdditional_Information_ItemID) 
        SELECT Description, Additional_Information_ItemID 
        FROM inserted

    DECLARE @Answer varchar(50)
    SELECT @Answer = '''%' + t.TempAnswer + '%''' FROM temp_answers t

    DECLARE @ItemId int
    SELECT @ItemId = t.TempAdditional_Information_ItemID FROM temp_answers t

    IF EXISTS(SELECT 1 
              FROM cc_Additional_Information_Answers a 
              WHERE a.Description LIKE @Answer 
               AND a.Additional_Information_ItemID = @ItemId)
    BEGIN
        RAISERROR('Answer is too similar to pre-existing answers for this item', 16, 1)
        ROLLBACK TRANSACTION
        RETURN
    END

    DROP TABLE temp_answers
END 
GO

И это мой запрос вставки:

INSERT INTO cc_Additional_Information_Answers (Additional_Information_ItemID, Description)
VALUES (103, 'a')

И ранее существовавшая запись:

existing record

Заранее спасибо, сообщество SQL!

РЕДАКТИРОВАТЬ: это также не ведет себя, как ожидалось. , ,

INSERT INTO cc_Additional_Information_Answers (Additional_Information_ItemID, Description)
VALUES (103, 'a')

Учитывая эти данные

enter image description here

1 Ответ

0 голосов
/ 03 июля 2018

Ваш IF EXISTS всегда будет иметь значение true, потому что вставленное значение уже вставлено (хотя его можно откатить) при запуске триггера (это триггер «AFTER»). Таким образом, вы хотите проверить только те записи, которые существовали в таблице до вставки. Я всегда использую внешнее соединение для этого. Также: я бы никогда не создал таблицу в триггере. Следующее должно работать как ожидалось:

CREATE TRIGGER TR_cc_Additional_Information_Answers_INS ON cc_Additional_Information_Answers
AFTER INSERT 
AS
BEGIN

  IF EXISTS(
     SELECT 1 FROM cc_Additional_Information_Answers a 
       LEFT OUTER JOIN inserted i ON a.Additional_Information_AnswerID = i.Additional_Information_AnswerID
       INNER JOIN inserted temp ON a.Additional_Information_ItemID = temp.Additional_Information_ItemID
      WHERE a.Description LIKE '%' + temp.Description + '%'
        AND i.Additional_Information_AnswerID IS NULL
     )
     BEGIN
       RAISERROR('Answer is too similar to pre-existing answers for this item', 16, 1)
       ROLLBACK TRANSACTION
       RETURN
     END
END 
GO
...