2014-09-19 2 views
0

У меня есть инструкция insert, которая выполняется во внутреннем триггере, но оператор insert вставляет в ItemLookups значение из ItemsProduced a, где он существует, вместо этого обновляет a.Casecount и только вставляет туда он не существует. Где я могу включить свои команды «Обновить» и «Установить» в этом запросе? Любые предложения? Спасибо за любую помощь.Вставить и выбрать последнюю строку из объединений

USE [**] 
GO 
/****** Object: Trigger [dbo].[spItemLookupNActuals] Script Date: 09/18/2014 14:30:09 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

-- ============================================= 

-- ============================================= 
ALTER TRIGGER [dbo].[spItemLookupNActuals] 
    ON [dbo].[ItemsProduced] 
    AFTER INSERT,DELETE,UPDATE 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 



    INSERT INTO dbo.itemlookup 
      ( 
         itemnumber, 
         cases, 
         [Description], 
         [Type], 
         wic, 
         elc, 
         totalelc, 
         lbspercase, 
         totallbs, 
         peoplerequired, 
         schedulehours, 
         rated, 
         capacity, 
         shift, 
         [DateTime], 
         [TimeStamp] 
      ) 
SELECT TOP 1 
      a.itemnumber, 
      a.casecount, 
      b.itemdescription, 
      b.divisioncode, 
      b.workcenter, 
      b.laborpercase, 
      a.casecount* b.laborpercase* c.ipcg, 
      b.lbspercase, 
      b.lbspercase* a.casecount, 
      b.personsreqd, 
      d.schedhours, 
      b.poundrating, 
      b.poundrating*d.schedhours, 
      a.shift, 
      a.datetime, 
      a.timestamp 
FROM  itemsproduced a 
INNER JOIN masteritemlist b 
ON   a.itemnumber = b.itemnumber 
CROSS apply 
      ( 
        SELECT TOP 1 
           * 
        FROM  itemmultipliers2 c 
        WHERE c.datetime = a.datetime 
        ORDER BY c.timestamp DESC)c 
CROSS apply 
      ( 
        SELECT TOP 1 
           * 
        FROM  itemactuals d 
        WHERE d.datetime =a.datetime 
        AND  d.wc = b.workcenter 
        AND  d.shift= a.shift 
        ORDER BY d.timestamp DESC) d 
WHERE  NOT EXISTS 
      ( 
        SELECT * 
        FROM itemlookup 
        WHERE itemnumber =a.itemnumber 
        AND shift=a.shift 
        AND datetime = a.datetime) 
    end 
+1

Возможно, разбить триггеры для вставки/обновления/удаления в отдельные, чтобы вы не пытались включить только что удаленную запись или вставить только что обновленную запись? –

ответ

1

Триггеры не обязательно должны быть одиночными: они могут содержать более сложную логику. (Это ответ на ваш вопрос: «Где я могу включить свои команды« Обновить и установить »в этом запросе?») Таким образом, вы можете написать условную логику. В конце концов, вы, вероятно, захотите сделать что-то отличное от ItemLookup, когда ItemsProduced имеет запись, удаленную, чем при добавлении записи. Вы также можете написать отдельные триггеры для разных событий.

Возможно, вы захотите использовать встроенные таблицы inserted и deleted, которые доступны в триггере. Это позволит вам иметь дело со значениями именно тех записей, которые были затронуты, вместо того, чтобы пытаться определить их, просмотрев временные метки, как это делается в ваших инструкциях CROSS APPLY. Они описаны here.

(Вы также делаете TOP 1 без ORDER BY на главном запросе, так, что запись вы получаете за что «1» не может быть предсказано.)

Имейте в виду, а также, что триггер вызывается один раз за действие манипулирования данными (например, INSERT или UPDATE), а не один раз за измененную запись. Таким образом, вы можете изменить несколько строк, производящих только один вызов триггера.

Надеюсь, это поможет.

+0

Спасибо Энн, вы предоставили мне несколько полезных указателей и заставляли меня думать о вещах по-другому, в хорошем смысле :) Я ценю ваши предложения и опыт. – ENGR024

Смежные вопросы