SQL 결과 집합을 최대 행 수의 배치로 분할해야합니다. 이것은 75M + 행이있는 테이블에서 벗어나 Excel 또는 While 루프를 사용하는 것과 같은 많은 "간단한"해결 방법이 작동하지 않을 것입니다.배치 SQL 서버 결과 최대 행 수
다음 의지 설정 예 :
BatchId TeamPersonId TeamId PersonId
1 1 1 101
1 6 2 101
1 11 3 101
1 16 4 101
1 21 5 101
2 22 5 102
2 17 4 102
2 12 3 102
규칙이 경우 :
SELECT DENSE_RANK()OVER (ORDER BY PersonId) as BatchGroupId, *
FROM TeamPersonMap ORDER BY PersonId
이 결과 집합이 될 것입니다 :
CREATE TABLE [dbo].[TeamPersonMap](
[TeamPersonId] [int] IDENTITY(1,1) NOT NULL,
[TeamId] [int] NOT NULL,
[PersonId] [int] NOT NULL
)
GO
DECLARE @itemCount int = 0
WHILE (@itemCount < 5)
BEGIN
SET @itemCount = @itemCount + 1
DECLARE @personId int = 100
WHILE (@personId < 105)
BEGIN
SET @personId = @personId + 1
INSERT INTO TeamPersonMap (TeamId, PersonId) VALUES (@itemCount, @personId)
END
END
이제 우리는 다음 쿼리를 실행할 수 있습니다 최대 배치 크기가 3이고 PersonId가 다음과 같은 최종 BatchId를 얻기 위해 쿼리해야하는 동일해야 함 다음과 같습니다. personid에 의해 분할
BatchId TeamPersonId TeamId PersonId
1 1 1 101
1 6 2 101
1 11 3 101
2 16 4 101
2 21 5 101
3 22 5 102
3 17 4 102
3 12 3 102
감사합니다,이 위대한 -을 완벽하게 작동합니다! SQL을 행복하게 만들기 위해'with '문 앞에 세미콜론을 추가했습니다 - SQL Fiddle은 상관하지 않지만 SSMS 2008은 특정 시간에 보이는 것 같습니다. – Nicknow
문제 없습니다. 세미콜론은 시작 부분이 아닌 SQL 문 끝에서 시작하므로 세미콜론 문제는 같은 워크 시트에 끝나는 세미콜론이없는 이전 SQL 문이 있음을 의미합니다. – ivanatpr