我创建临时表,插入数据(和输出)并选择。我需要批处理并阅读。
示例:如果我有110条记录,并且我想每次读取一批50条记录,那么我将在第一次读取1-50,第二次读取51-100,第三次读取100-110。
查询如下
create table #mytable
{
customerID int not null
}
insert into #mytable(id)
Output inserted.CustomerID
select top 50 customerID from customer where customerID not in (select c.customerID from #mytable c)
在C#中,我的代码就像这样
do {
getCustomerInformation() //this method does the query processing
} while(customerInfo.Any());
当我在SQL服务器上运行但不在C#中运行时,此查询有效。保持始终返回前50行。
答案 0 :(得分:0)
有办法..
从SQL Server 2012开始,我们可以使用OFFSET和FETCH NEXT子句来实现分页。
2对于2005年的所有sql版本,我们可以通过CTE实现相同的功能并传递Param more detals
答案 1 :(得分:0)
简单使用此查询,
1)第一次@PageNumber参数为1, 第二次将是2次和第三次发送3
DECLARE @PageNumber AS INT, @RowspPage AS INT
SET @PageNumber = 1 -- 2 , 3
SET @RowspPage = 50
SELECT customerID FROM (
SELECT ROW_NUMBER() OVER(ORDER BY id) AS Numero,
customerID FROM customer
) AS TBL
WHERE Numero BETWEEN ((@PageNumber - 1) * @RowspPage + 1) AND (@PageNumber * @RowspPage)
ORDER BY customerID
答案 2 :(得分:0)
在SSMS中,您有临时表,并通过检查临时表来检查批次的ID。
临时表通常只与会话一样长。因此,如果在C#中每次调用方法时都初始化一个新会话,那么您的会话将不会看到上一个会话中的临时表。
你可以使用##两个哈希来解决这个问题,或者只是创建一个实际的临时表。
答案 3 :(得分:0)
您可以使用LINQ提供的Take()
和Skip()
方法在C#中实现分页:
const int batchSize = 50;
do {
var currentBatch = customerInfo.Take(batchSize);
customerInfo = customerInfo.Skip(batchSize);
} while(customerInfo.Any());