więc tak
Kalendarz
CREATE TABLE #CalendarDay ([Date] date)
declare @startDate date = '2012-01-01'
while @startDate <= '2012-06-01'
begin
insert into #CalendarDay
values (@startDate)
set @startDate = DATEADD(day,1,@startDate)
end
Tabela wynikowa
CREATE TABLE #ItemdeactivationPerDay ([ID_STORE] int,[ID_ARTICLE] int,[DATE] date,[FLAG] bit)
Tabela źródłowa z danymi
CREATE TABLE #ItemdeactivationRanges ([ID_STORE] int,[ID_ARTICLE] int,[DATE_FROM] date,[DATE_TO] date)
insert into #ItemdeactivationRanges ([ID_STORE],[ID_ARTICLE],[DATE_FROM],[DATE_TO])
VALUES (1,2222,'2012-01-01','2012-02-01'),
(1,2222,'2012-03-01','2012-04-28'),
(2,2422,'2012-02-01','2012-03-01'),
(3,2222,'2012-01-02','2012-03-15'),
(4,2121,'2012-04-01','2012-05-01'),
(1,4442,'2012-03-01','2012-04-01'),
(1,1241,'2012-01-11','2012-02-01')
Mój kursor
DECLARE @DATE DATE
DECLARE cPerDay CURSOR
FOR
SELECT * FROM #CalendarDay
OPEN cPerDay
FETCH NEXT FROM cPerDay INTO @DATE
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO #ItemdeactivationPerDay([ID_STORE],[ID_ARTICLE],[DATE],[FLAG])
SELECT
[ID_STORE]
,[ID_ARTICLE]
,@DATE AS [DATE]
,CASE WHEN @DATE between [DATE_FROM] AND [DATE_TO] THEN 1 ELSE 0 END AS FLAG
FROM
#ItemdeactivationRanges
FETCH NEXT FROM cPerDay INTO @DATE
END
CLOSE cPerDay
DEALLOCATE cPerDay
No i ogólnie mam to tak rozwiązane jak dodam przy kursorze FAST_FORWARD to idzie o 30% szybciej dla większej ilości danych.
bodajże wejsciowych jest koło 100k wierszy a wypluwa około 100kk wierszy. idzie około 5 minut bez Fasta