Это код SQL, который проходит через таблицу, содержащую различные записи с начальными и конечными данными, такими как медленно изменяющееся измерение. При проверке измерения мы выяснили, что иногда дата начала не соответствует дате окончания. Таким образом, мы зацикливаем таблицу и воссоздаем даты начала и окончания, чтобы убедиться, что дата начала/окончания на самом деле равна min/max доступных дат. Но процесс занимает слишком много времени, чтобы работать через 9 миллионов строк. Я хотел бы использовать цикл while, но не могу понять, чтобы сохранить значение min/max и определить переключатель в ID.Может кто-нибудь помочь мне с заменой курсора в следующем SQL-коде.
DECLARE @MINDDEB Datetime
DECLARE @DDEB Datetime
DECLARE @DFIN Datetime
DECLARE @CECV float
DECLARE @AIDNEBHNPRPEP int
DECLARE @CETA float
DECLARE @AIDNEBHNPRAFI int
DECLARE @MAXDFIN Datetime
DECLARE @OLDCECV float
DECLARE @OLDAIDNEBHNPRPEP int
DECLARE @OLDCETA float
DECLARE @OLDAIDNEBHNPRAFI int
SET @MINDDEB=9999-12-31
SET @MAXDFIN=1835-12-31
drop table dbo.TBYDWHTEBHNPRAFIVRS_CURSORTABLE
--T2
SELECT DDEB, DFIN, CETA,AIDNEBHNPRAFI
into dbo.TBYDWHTEBHNPRAFIVRS_CURSORTABLE
FROM dbo.TBYDWHTEBHNPRAFIVRS
WHERE AIDNEBHNPRAFI=-1
ORDER BY AIDNEBHNPRAFI,DDEB
DECLARE T2_CURSOR CURSOR FOR
select DDEB, DFIN, CETA,AIDNEBHNPRAFI
from TBYDWHTEBHNPRAFIVRS
where DFIN>DDEB and BRRDDEL<>1 and CSTUVRS = 1 --and AIDNEBHNPRAFI in (1080,1033143,2311904)
order by AIDNEBHNPRAFI,DDEB,CETA,CECV
OPEN T2_CURSOR
FETCH NEXT FROM T2_CURSOR
INTO @DDEB, @DFIN, @CETA,@AIDNEBHNPRAFI
SET @[email protected]
SET @[email protected]
--SET @[email protected]
WHILE @@FETCH_STATUS = 0
BEGIN
if (@[email protected] and @[email protected])
BEGIN
--print 'entering first if'
IF (@MINDDEB>@DDEB)
BEGIN
SET @[email protected]
END
IF (@MAXDFIN<@DFIN)
BEGIN
SET @[email protected]
END
END
--print ' OLD CECV '+convert(varchar(10),@OLDCECV) +' new CECV '+ convert(varchar(10),@CECV) +' OLDAID '+ convert(varchar(10),@OLDAIDNEBHNPRPEP) +' NEWAID '+ convert(varchar(10),@AIDNEBHNPRPEP)
-- +' NEWDDEB '+ convert(varchar(10),@DDEB,101) +' MINDDEB '+ convert(varchar(10),@MINDDEB,101) +' NEWDFIn '+ convert(varchar(10),@DFIN,101) +' MAXDFIN '+ convert(varchar(10),@MAXDFIN,101)
FETCH NEXT FROM T2_CURSOR
INTO @DDEB, @DFIN, @CETA,@AIDNEBHNPRAFI
if (@OLDCETA<>@CETA or @OLDAIDNEBHNPRAFI<>@AIDNEBHNPRAFI)
BEGIN
INSERT INTO TBYDWHTEBHNPRAFIVRS_CURSORTABLE (DDEB, DFIN, CETA,AIDNEBHNPRAFI)
VALUES (@MINDDEB,@MAXDFIN,@OLDCETA,@OLDAIDNEBHNPRAFI)
SET @[email protected]
--SET @[email protected]
SET @[email protected]
SET @[email protected]
SET @[email protected]
END
END
INSERT INTO TBYDWHTEBHNPRAFIVRS_CURSORTABLE (DDEB, DFIN, CETA,AIDNEBHNPRAFI)
VALUES (@MINDDEB,@MAXDFIN,@OLDCETA,@OLDAIDNEBHNPRAFI)
CLOSE T2_CURSOR;
DEALLOCATE T2_CURSOR;
Это исходные данные
DDEB DFIN CETA AIDNEBHNPRAFI
2006-03-01 00: 00: 00,000 2006-04-30 23: 59: 59,000 1 +231272
2006-05-01 00 : 00: 00.000 2006-11-30 23: 59: 59 000 1 231272
2006-12-01 00: 00: 00.000 2007-04-30 23: 59: 59.000 1 231272
2007-05-01 00:00 : 00.000 2008-04-30 23: 59: 59 000 1 231272
2008-05-01 00: 00: 00.000 2008-08-31 23: 59: 59.000 1 231272
2008-09-01 00:00:00 , 000 2008-10-31 23: 59: 59 000 2 231272
2008-11-01 00: 00: 00.000 2009-04-30 23: 59: 59.000 1 231272
2009-05-01 00: 00: 00.000 2010 -01-31 23: 59: 59,000 1 231272
2010-02-01 00: 00: 00,000 9999-12-31 23: 59: 59.000 14 231272
и это результат, который мы получаем с помощью курсора
DDEB DFIN СЕТА AIDNEBHNPRAFI
2006-03-01 00: 00: 00,000 2008-08-31 23: 59: 59,000 1 231272
2008-09-01 00: 00: 00,000 2008-10-31 23: 59: 59 000 2 231272
2008-11-01 00: 00: 00.000 2010-01-31 23: 59: 59 000 1 231272
2010-02-01 00: 00: 00.000 9999-12-31 23: 59: 59.000 14 231272
Либо упростите и минимизируйте вопрос, либо наймите кого-нибудь. – jarlh
@jarlh, ваш комментарий выглядит как реклама для меня, как вы говорите * или нанимаете кого-то * ... :) – Rahul
@Rahul, но я не тот кто-то. – jarlh