Поместите два запроса в оператор запуска

#sql #sql-server

#sql #sql-сервер

Вопрос:

Я помещаю следующие запросы в триггер (он был создан нормально), и будут ли они выполняться / выполняться в следующем порядке: сначала вставить, затем обновить?

Вперед

 CREATE TRIGGER [FieldID]
ON [Field].[AttributeValues]
AFTER INSERT  
AS  
    INSERT INTO [Field].[Field_ElementID] (Path) 
        SELECT DISTINCT Path     
        FROM [Field].[AttributeValues] 
        WHERE Path NOT IN (SELECT Path FROM [Field].[Field_ElementID])

    UPDATE [Field].[AttributeValues] 
    SET PathID = (SELECT Id FROM [Field].[Field_ElementID] 
                  WHERE [Field].[AttributeValues].[Path] = [Field].[Field_ElementID].[Path]) 
    WHERE PathID IS NULL
GO 
  

Спасибо,
S

Комментарии:

1. @marc_s это неправда. DB<> Скрипка . Однако это хорошая практика.

2. @Larnu итак, будут ли мои запросы работать так, как ожидалось?

3. Я этого не говорил @JoeGreen .

4. Честно говоря, я в замешательстве, почему вы не ссылаетесь на inserted объект. Какова ваша фактическая цель здесь?

5. Если вы имеете дело только с новыми строками, то почему вы не используете inserted объект, как я спрашивал ранее?

Ответ №1:

Лично (если я правильно понимаю ваш SQL) Я бы сделал это, но ваш второй запрос кажется странным, поскольку он вообще не ссылается inserted .

 CREATE TRIGGER [FieldID]
ON [Field].[AttributeValues]
AFTER INSERT
AS
BEGIN

    INSERT INTO FE ([Path])
    SELECT DISTINCT i.[Path]
    FROM inserted i
         LEFT JOIN [Field].[Field_ElementID] FE ON I.[Path] = FE.[Path]
    WHERE FE.ID IS NULL; --Needs correcting, if incorrect

    UPDATE AV
    SET PathID = FE.ID
    FROM [Field].[AttributeValues] --Seems really odd this doesn't reference inserted at all
         JOIN [Field].[Field_ElementID] FE ON AV.[Path] = FE.[Path]
    WHERE AV.PathID IS NULL;

END;