#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;