这可能是一个非常简单的事情,但是我在SQL Server,TSql甚至普通的SQL中都不是很全面。
我需要从一个非常大的表(2百万条记录)中检索所有记录,并且我在其他地方使用提取的数据作为制表符分隔文件。
我正在编写一个存储过程来获取此信息,但是所有200万条记录都太大了,因此我需要使用用户设置的行限制(@BatchSize)将数据返回多个select语句。
此特定表上的PK不是顺序的,因此在最后使用WHERE BETWEEN并不理想,因为每个Select调用返回不同数量的记录。在循环中设置SELECT TOP(@BatchLimit)将一遍又一遍地返回相同的X记录。
有没有办法可以让它返回@BatchLimit记录然后从它停止的地方继续?这听起来像是游标的工作,但是在我不确定之前从未使用过光标的人。任何帮助将不胜感激!
答案 0 :(得分:0)
我想分享一个用于将大型查询拆分成批处理的SQL代码段。
--OPTION 1: Select single part of the batch
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
DECLARE @batch TINYINT = 10
;WITH LargeTable AS(
SELECT RowNumber = ROW_NUMBER() OVER (ORDER BY c1.object_id) --ORDER BY Primary Key
,c1.*
FROM sys.columns as c1
CROSS APPLY sys.columns as c2
)
SELECT *
FROM LargeTable
WHERE RowNumber % 10 = 0 --select 1 out of 10
GO
--OPTION 2: Create a view and loop though your batches
CREATE VIEW dbo.vLargeTable AS(
SELECT RowNumber = ROW_NUMBER() OVER (ORDER BY c1.object_id) --ORDER BY Primary Key
,c1.*
FROM sys.columns as c1
CROSS APPLY sys.columns as c2
)
GO
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
DECLARE @batch TINYINT = 10
DECLARE @iteration TINYINT = 0
WHILE @iteration < @batch
BEGIN
SELECT @iteration
,*
FROM dbo.vLargeTable
WHERE RowNumber % @batch = @iteration --select 1 out of 10
SET @iteration = @iteration + 1
END