Запуск запроса на N количество строк

У меня есть производственная среда, и мне нужно запустить этот код и добавить в таблицу [RESULTS_TABLE], допустим, для каждых 10K строк FROM TABLE [SOURCETABLE]. Как мне это сделать? (из-за ограничений системы и памяти я должен это сделать).

BEGIN
 SET NOCOUNT ON;

 IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[RESULTS_TABLE]') AND type IN (N'U'))
 DROP TABLE [RESULTS_TABLE]

 CREATE TABLE [RESULTS_TABLE](
 [CLAIM_ID] [nvarchar](15) NULL,
 [CIN] [nvarchar](10) NULL,
 [SVC_DATE] [datetime] NULL,
 [SVC_DATE_TO] [datetime] NULL,
 [TOTAL_DAYS] [int] NULL,
 [CHAIN_COUNT] [int] NULL
 ) ON [PRIMARY]

 ;WITH chain_builder AS
 (
 SELECT ROW_NUMBER() OVER(ORDER BY s.CIN, s.CLAIM_ID) as chain_ID,
 s.CIN,
 s.SVC_DATE, s.SVC_DATE_TO, s.CLAIM_ID, 1 as chain_count
 FROM [SOURCETABLE] s
 WHERE s.SVC_DATE <> ALL 
 (
 SELECT DATEADD(d, 1, s2.SVC_DATE_TO)
 FROM [SOURCETABLE] s2
 WHERE s.CIN = s2.CIN
 )
 UNION ALL
 SELECT chain_ID, s.CIN, s.SVC_DATE, s.SVC_DATE_TO,
 s.CLAIM_ID, chain_count + 1
 FROM [SOURCETABLE] s
 JOIN chain_builder as c
 ON s.CIN = c.CIN AND
 s.SVC_DATE = DATEADD(d, 1, c.SVC_DATE_TO)
 ),
 chains AS
 (
 SELECT chain_ID, CIN, SVC_DATE, SVC_DATE_TO,
 CLAIM_ID, chain_count, ROW_NUMBER() OVER(PARTITION BY chain_ID, chain_count ORDER BY SVC_DATE_TO DESC) as link_row
 FROM chain_builder
 ),
 link_picker AS
 (
 SELECT chain_ID, CIN, SVC_DATE, SVC_DATE_TO,
 CLAIM_ID, chain_count
 FROM chains
 WHERE link_row = 1
 ),
 diff AS
 (
 SELECT c.chain_ID, c.CIN, c.SVC_DATE, c.SVC_DATE_TO,
 c.CLAIM_ID, c.chain_count,
 datediff(day,c.SVC_DATE,c.SVC_DATE_TO)+1 daysdiff
 FROM link_picker c
 ),
 diff_sum AS
 (
 SELECT chain_ID, CIN, SVC_DATE, SVC_DATE_TO,
 CLAIM_ID, chain_count,
 SUM(daysdiff) OVER (PARTITION BY chain_ID) as total_diff
 FROM diff
 ),
 diff_comp AS
 (
 SELECT chain_ID, CIN,
 MAX(total_diff) OVER (PARTITION BY CIN) as total_diff
 FROM diff_sum
 )
 INSERT INTO [dbo].[LTAC_TEST_1]
 SELECT DISTINCT ds.CLAIM_ID, ds.CIN, ds.SVC_DATE,
 ds.SVC_DATE_TO, ds.total_diff as TOTAL_DAYS, ds.chain_count as CHAIN_COUNT
 FROM diff_sum ds
 JOIN diff_comp dc
 ON ds.chain_ID = dc.chain_ID AND ds.CIN = dc.CIN
 AND ds.total_diff = dc.total_diff
 OPTION (maxrecursion 0)
END
GO
2 ответа

Вы можете попытаться создать хранимую процедуру. В процедуре добавьте свой sql, но ограничьте объем работы, которую он делает, используя "top 10000". Что-то вроде этого:

SELECT TOP 10000 ROW_NUMBER() OVER(ORDER BY s.CIN, s.CLAIM_ID) as chain_ID, ...

Затем настройте задание SSIS для периодической работы хранимой процедуры. Если результат превышает 10 000, он поймает следующие 10 000 при следующем запуске хранимой процедуры.


Для следующих 10000

использование

выберите топ 20000...

Кроме

выберите топ 10000...

licensed under cc by-sa 3.0 with attribution.