2017-01-03 2 views
2

у меня есть расписание таблицы, как этотКак создать триггер для обновления таблицы из других данных таблицы

ID |  FROM  |  TO  | day of week 
1 |  12/10/2016 | 01/03/2017 |  2 
2 |  10/12/2016 | 10/15/2017 |  7 
3 |  10/14/2016 | 10/20/2017 |  1 
4 |  01/20/2016 | 01/30/2017 |  5 
5 |  11/25/2016 | 01/30/2017 |  3 
6 |  11/29/2016 | 01/30/2017 |  3 

мне нужно создать триггер: после каждой вставки, другая таблица (single_date) должна быть обновлена ​​с перевод вставленной строки.

Например первая строка означает: каждый вторник между 12/10/2016 и 01.01.2017

и single_date таблицы следует обновить со следующими строками

ID | schedule_ID |  date  
1 |  1  | 12/13/2016 
2 |  1  | 12/20/2016 
3 |  1  | 12/27/2016 
4 |  1  | 01/03/2017 
+2

Что вы пробовали до сих пор? Является ли это триггером, в котором вам нужна помощь или базовая вставка? – JohnHC

+0

Возможный дубликат [создание триггеров после вставки, после обновления и после удаления в SQL] (http://stackoverflow.com/questions/16859804/creating-triggers-for-after-insert-after-update-and-after- delete-in-sql) – Cybersupernova

ответ

1

После того, как у вас есть триггер, вы можете использовать этот запрос для вставки ...

with Numbers as 
(select 1 as NN 
union all 
select NN + 1 
where NN < 9999 
) 
insert into single_date (schedule_id, date) 
select @schedule_id, dateadd(d,NN, @FromDate) 
from Numbers 
where datepart(dw,dateadd(d,NN, @FromDate)) = @day_of_week -- This might need converting depending on your DW settings 
and dateadd(d,NN, @FromDate) between @From_Date and @To_Date 
-2

Вам лучше изменить его использование call_back methoud в программе.

+0

с использованием метода call_back, проблема останется такой же –

2

Ниже приводится код для триггера After Insert.

Create table Maintable 
(
ID int, 
FROMD date, 
TOD date, 
day_of_week int 
) 

Create table trgTable 
(
ID int identity(1,1), 
schedule_ID int, 
Insdate date 
) 


CREATE TRIGGER trgAfterInsert ON Maintable 
FOR INSERT 
AS 
begin 
    DECLARE @MinDate DATE, @MaxDate DATE, @dow int, @id int 

    SELECT 
     @MinDate = FROMD, @MaxDate = TOD, @dow = day_of_week, @id = id 
    FROM Inserted i 

    ;With CTE AS 
    (
     SELECT TOP (DATEDIFF(DAY, @MinDate, @MaxDate) + 1) 
       Date = DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.object_id) - 1, @MinDate) 
     FROM sys.all_objects a 
       CROSS JOIN sys.all_objects b 
    ) 
    Insert into trgTable 
    Select @id, Date from CTE 
    Where datepart(dw, Date) = @dow 
end 

Insert into Maintable values (1, '12-10-2016','01-03-2017', 2) 

Select * from Maintable; 
Select * from trgTable; 

Выход:

ID | schedule_ID |  insdate  
1 |  1  | 12-13-2016 
2 |  1  | 12-20-2016 
3 |  1  | 12-27-2016 
4 |  1  | 01-03-2017