从临时表中批处理数据

时间:2016-06-28 04:18:41

标签: c# sql-server

我创建临时表,插入数据(和输出)并选择。我需要批处理并阅读。

示例:如果我有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行。

4 个答案:

答案 0 :(得分:0)

有办法..

  1. 从SQL Server 2012开始,我们可以使用OFFSET和FETCH NEXT子句来实现分页。

    Try this:

  2. 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());