2016-07-04 41 views
2

我试图从SQL Server中的某些表中选择1000行,并且在某些情况下很容易,因为我确实有一个密钥,它是BIGINT。因此,我店,我已经取了关键的最后一个数字,然后我给它添加100见下文:当密钥不是数字,而是字母数字值时,选择循环中的特定行数

--Get the last loaded record 
DECLARE @StartIndex BIGINT 

SET @StartIndex = 1 + (SELECT [StoredIndex] 
         FROM [DB].[dbo].[MasterData] 
         WHERE [Status] = 'LastLoad') 

--Declare and set the last record that was loaded 
DECLARE @EndIndex BIGINT 

--Retrieve the next @Step+1 or less records and store them in a temporary table 
SELECT T1.* 
INTO #TempResults 
FROM 
    --Get the next @Step+1 or less records 
    (SELECT * 
    FROM ANOTHERDB.[TableName] 
    WHERE [Tables_ID] BETWEEN @StartIndex AND @StartIndex + 1000) T1 

--Set the index of the last record inserted 
SET @EndIndex = (SELECT MAX([Tables_ID])--The next record fetched with the largest ID 
       FROM #TempResults) 

但是如何做到这一点的时候,关键是字母数字值?

什么是

WHERE [Tables_ID] BETWEEN @StartIndex AND @StartIndex + 1000 

相当于如果@StartIndexnvarchar,例如123g7_56y7f

感谢yoU!

+0

是你的'[Tables_ID]'可以包含NVARCHAR数据吗?我不这么认为 –

+0

在我感兴趣的第二种情况下,Table_ID(即一个虚拟名称)是varchar(64) – aragorn

回答

1

方法1:

如果您正在使用的SQL Server 2012或更高您可以按以下使用offset fetch

SELECT * 
    FROM  ANOTHERDB.[TableName] 
    ORDER BY Col1 
    OFFSET XX ROWS FETCH NEXT YY ROWS ONLY; 

Col1中=你要排序的列数据

XX =要跳过的行数

YY =行数要获取

方法2:

您可以使用Row_Number功能(SQL Server 2008或更高),如下的:

SELECT * 
    FROM  (SELECT * , 
        ROW_NUMBER() OVER (ORDER BY COL1) AS RN 
      FROM  ANOTHERDB.[TableName] 
     ) AS K 
    WHERE  K.RN BETWEEN XX AND YY; 
+0

我使用方法2,它似乎工作。谢谢! – aragorn

2

SQL表没有default order。因此,除非您可以使用ORDER BY clause来定义一个记录,否则不会有前1000个或最后1,000个记录。

如果您尝试返回添加到表中的最后1,000条记录,则需要捕获创建每条记录的日期和时间。您不能依赖identify column,因为这些可能是reseededupdated

合并TOPORDER BY来限制返回的记录数。升序返回第一个n结果。降序最后n结果。

-- Limits results to the last 1,000 records. 
SELECT TOP 1000 
    * 
FROM 
    YourTable 
ORDER BY 
    YourColumn DESC 
; 

根据需要更换YourTableYourColumn

+0

正确的是我使用Vahid解决方案的原因。谢谢大家的答案。 – aragorn

相关问题