2014-11-03 1 views
0

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

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 

ответ

0

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

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

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

+0

Как выбрать следующие 10000 записей тогда? как я петлю? – Edgar

+0

Да, петля будет работать хорошо. Если вы повторно запустите это, как вы мешаете процессу собирать дубликаты? В основном я использую столбец статуса, который указывает, что я уже обработал строку. – Jay

0

Для следующего 10000

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

выбрать топ 20000 ...

кроме

выбрать верхнюю 10000 ...

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