我想将一张表中的数据分段读取(第一次读取1行-1000行 第二次读取 1001行-2000行)。在MYSQL下我知道可以使用limit就可以。可是在SQL SERVER下如何写这个SQL语句呢??  

解决方案 »

  1.   

    1-1000:select top 1000
    1001-2000:select top 1000 * from (select top 2000 * from table order by id asc) table_别名 order by id desc
      

  2.   

    你好,使用top即可,用索引做order by id desc即可,謝謝。
      

  3.   

    select top 1000 from table where id not in (select top 1000 from table)另外sql server中还有一个SET ROWCOUNT ,你可以看看能否满足你的要求
      

  4.   

    你要是不会用set rowcount,那就还是用TOP吧
      

  5.   

    select top可以实现楼主的要求
      

  6.   

    select top这个方法不太好,不通用,建议用分页的存储过程吧
      

  7.   

    也就是说,我想将一个大概20w条数据的表加载到内存中。用什么方法加载比较好。我直接使用 Select * from TableName 的SQL语句来加载的话,会出现当我加载到17441条记录的时候。程序的ADOQuery.Next语句不响应的问题。不知道这是为什么?
      

  8.   

    我的ADOQUERY的相关设置是:
    FReadQuery.LockType:=ltBatchOptimistic;
      FReadQuery.CacheSize:=1000;
      FReadQuery.CursorLocation:=clUseServer;
      FReadQuery.CursorType:=ctStatic;
      

  9.   

    SQL code
    /*
    参数说明:
    1.Tables :表名称,视图
    2.PrimaryKey :主关键字
    3.Sort :排序语句,不带Order By 比如:NewsID Desc,OrderRows Asc
    4.CurrentPage :当前页码
    5.PageSize :分页尺寸
    6.Filter :过滤语句,不带Where 
    7.Group :Group语句,不带Group ByEXEC Pagination 'CRM_Client','cusCode','LastLinkDate DESC',1,20,
    'cusCode,cusName,userId,productId,levelCode,cusProvId,cusCityId,deveStatus,dredgeStat',
    ' cusNStatus =60  and productId = 30 ',''
    ***************************************************************/
    ALTER     PROCEDURE Pagination
    (
        @Tables varchar(1000),
        @PrimaryKey varchar(100),
        @Sort varchar(200) = NULL,
        @CurrentPage int = 1,
        @PageSize int = 10,
        @Fields varchar(1000) = '*',
        @Filter varchar(1000) = NULL,
        @Group varchar(1000) = NULL,
        @total INT OUTPUT
    )
    AS
    BEGIN
        /*默认排序*/
        IF @Sort IS NULL or @Sort = ''
        SET @Sort = @PrimaryKey
        DECLARE @SortTable varchar(100)
        DECLARE @SortName varchar(100)
        DECLARE @strSortColumn varchar(200)
        DECLARE @operator char(2)
        DECLARE @type varchar(100)
        DECLARE @prec int
        DECLARE @totalSQL nvarchar(200) SET @totalSql= ''    IF LEN(@Filter) > 0 BEGIN
        
            SET @totalSQL= 'SELECT @TotalCount=count('+@PrimaryKey+') FROM ' + @Tables+' WHERE ' + @Filter    END ELSE BEGIN        SET @totalSQL= 'SELECT @TotalCount=count('+@PrimaryKey+') FROM ' + @Tables    END
        
        EXEC sp_executesql @totalSQL,N'@TotalCount int=0 output',@total output
        /*设定排序语句.*/    IF CHARINDEX('DESC',@Sort)>0    BEGIN        SET @strSortColumn = REPLACE(@Sort, 'DESC', '')
            SET @operator = '<='    END ELSE BEGIN        --IF CHARINDEX('ASC', @Sort) = 0
            SET @strSortColumn = REPLACE(@Sort, 'ASC', '')
            SET @operator = '>='    END    IF CHARINDEX('.', @strSortColumn) > 0 BEGIN        SET @SortTable = SUBSTRING(@strSortColumn, 0, CHARINDEX('.',@strSortColumn))
            SET @SortName = SUBSTRING(@strSortColumn, CHARINDEX('.',@strSortColumn) + 1, LEN(@strSortColumn))    END ELSE BEGIN
            SET @SortTable = @Tables
            SET @SortName = @strSortColumn
        END    Select @type=t.name, @prec=c.prec FROM sysobjects o JOIN syscolumns c on o.id=c.id JOIN systypes t on c.xusertype=t.xusertype
        Where o.name = @SortTable AND c.name = @SortName    IF CHARINDEX('char', @type) > 0
        SET @type = @type + '(' + CAST(@prec AS varchar) + ')'    DECLARE @strPageSize varchar(50)
        DECLARE @strStartRow varchar(50)
        DECLARE @strFilter varchar(300)
        DECLARE @strSimpleFilter varchar(300)
        DECLARE @strGroup varchar(100)    /*默认当前页*/
        IF @CurrentPage < 1
        SET @CurrentPage = 1
        /*设置分页参数.*/
        SET @strPageSize = CAST(@PageSize AS varchar(50))
        SET @strStartRow = CAST(((@CurrentPage - 1)*@PageSize + 1) AS varchar(50))
        /*筛选以及分组语句.*/
        
        IF @Filter IS NOT NULL AND @Filter != '' BEGIN        SET @strFilter = ' Where ' + @Filter + ' '
            SET @strSimpleFilter = ' AND ' + @Filter + ' '    END ELSE BEGIN        SET @strSimpleFilter = ''
            SET @strFilter = ''    END
        IF @Group IS NOT NULL AND @Group != ''
        SET @strGroup = ' GROUP BY ' + @Group + ' '
        ELSE
        SET @strGroup = ''
        /*执行查询语句*/
        EXEC(
        '
        DECLARE @SortColumn ' + @type + '
        SET ROWCOUNT ' + @strStartRow + '
        Select @SortColumn=' + @strSortColumn + ' FROM ' + @Tables + @strFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + '
        SET ROWCOUNT ' + @strPageSize + '
        Select ' + @Fields + ' FROM ' + @Tables + ' Where ' + @strSortColumn + @operator + ' @SortColumn ' + @strSimpleFilter + ' ' + @strGroup + ' orDER BY ' + @Sort + '
        '
        )END
    GO
    SET QUOTED_IDENTIFIER OFF 
    GO
    SET ANSI_NULLS ON 
    GO