2014-11-03 69 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 2014-11-03 22:42:14

+0

是的,一個循環會運作良好。如果反覆執行此操作,您是如何防止進程重複複製的?我大多使用狀態欄來表示我已經處理了一行。 – Jay 2014-11-03 23:01:50

0

在接下來的10000

使用

選擇頂部20000 ...

除了

選擇頂部10000 ...