2014-11-03 70 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 ...