mssql中,如何返回指定第几到第几条之间的记录

用top可以返回前n条,但如果一个查询结果有100条数据
我只想返回第20-30条之间的数据,可以实现吗

如果可以实现,那我指明返回的是第90-110条时,会报错吗,如何避免这样的错误(另加20分)

第20-30条:
select top 30 * from tablename a where a.id not in(select top 20 id from tablename)
你是想用变量代替TOP 后面的数字吧?那要看你是在前台组成语句还是在后台了。
在前台:
SQLSTR="select top "+大号变量+" * from tablename a where a.id not in(select top "+小号变量+" id from tablename)";
在后台要用动态SQL语句才行
exec ('select top '+@大号变量+' * from tablename a where a.id not in(select top '+@小号变量+' id from tablename')
============================
这样通用性更强一些:
DECLARE
@SQLSTR VARCHAR(1000),
@TABLENAME VARCHAR(30),
@MAXLINE INT,
@MINLINE INT,
@IDFIELD
SET @SQLSTR='select top '+CAST(@line AS VARCHAR)+' * from '+@tablename+' where '+@idfield+' in (select top '+CAST(@MAXLINE AS VARCHAR)+' '+@idfield+' from '+@TABLENAME+' a where '+@idfield+' not in (select top '+CAST(@MINLINE-1 AS VARCHAR)+' '+@idfield+' from '+@tablename+'))'
EXEC (@SQLSTR)

==========
干脆来一个存储过程,输入页码,表名,ID字段名,每页行数即可输出相应的记录:
CREATE PROCEDURE PAGEN
@PAGE INT,--第几页
@LINE INT,--每页行数
@TABLENAME VARCHAR(100),--表名
@IDFIELD VARCHAR(100) --用于唯一确定一条记录的ID字段名
AS
DECLARE @MAXLINE INT,@MINLINE INT,@SQLSTR VARCHAR(1000)
SET @MINLINE=(@PAGE-1)*@LINE+1--从这一行
SET @MAXLINE=@PAGE*@LINE--显示到这一行
SET @SQLSTR='select top '+CAST(@line AS VARCHAR)+' * from '+@tablename+' where '+@idfield+' in (select top '+CAST(@MAXLINE AS VARCHAR)+' '+@idfield+' from '+@TABLENAME+' a where '+@idfield+' not in (select top '+CAST(@MINLINE-1 AS VARCHAR)+' '+@idfield+' from '+@tablename+'))'
SELECT @SQLSTR
exec (@SQLSTR)
GO
使用:

EXEC PAGEN 3,10,'tablename','id'
温馨提示:内容为网友见解,仅供参考
第1个回答  2008-11-13
还是MySql好,要返回m-n之间的记录,很简单
select * from tab1 limit m,n (m,n都是从0开始计数)
第2个回答  2008-11-13
..你只想返回20条 那就选TOP 20条啊

或者循环时加个记数 记够20条就跳出循环

又或者设置记录对象的每页数量为20(pagesize)

指明返回90-110当然会出错了,为避免出错当然是每次输出前先判断指针是否已到记录尾(即最终记录)
第3个回答  2008-11-13
不能用between字句吗?
相似回答