Sql 每N行运行一个查询
我有一个生产环境,我需要运行此代码并将其附加到表[RESULTS\u table],比方说,对于表[SOURCETABLE]中的每10K行。我该怎么做?由于系统和内存的限制,我需要这样做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 [
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条记录?如何循环?是的,循环将很好地工作。如果重复运行此操作,如何防止进程拾取重复项?我通常使用一个状态列来表示我已经处理了一行。