当前位置:数据库 > SQLServer >>

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'
其他:..你只想返回20条 那就选TOP 20条啊

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

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

指明返回90-110当然会出错了,为避免出错当然是每次输出前先判断指针是否已到记录尾(即最终记录) 不能用between字句吗? 还是MySql好,要返回m-n之间的记录,很简单
select * from tab1 limit m,n  (m,n都是从0开始计数)

上一个:请问MSSQL的问题
下一个:MSSQL查询问题?高手请进~

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,