Sql 每N行运行一个查询

Sql 每N行运行一个查询,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我有一个生产环境,我需要运行此代码并将其附加到表[RESULTS\u table],比方说,对于表[SOURCETABLE]中的每10K行。我该怎么做?由于系统和内存的限制,我需要这样做 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\u table],比方说,对于表[SOURCETABLE]中的每10K行。我该怎么做?由于系统和内存的限制,我需要这样做

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

您可以尝试创建一个存储过程。在该过程中,添加sql,但使用“TOP10000”限制sql的工作量。大概是这样的:

SELECT TOP 10000 ROW_NUMBER() OVER(ORDER BY s.CIN, s.CLAIM_ID) as chain_ID, ...
然后设置SSIS作业以定期运行存储过程。如果有超过10000个结果,它将在存储过程的下一次运行中捕获下一个10000。

对于下一个10000

使用

选择前20000名

除了


选择前10000条…

如何选择下10000条记录?如何循环?是的,循环将很好地工作。如果重复运行此操作,如何防止进程拾取重复项?我通常使用一个状态列来表示我已经处理了一行。