在SQL Sever 传入任意SQL,传出分页SQL(高手请教,网上Copy的走开)
发布网友
发布时间:2022-05-03 18:54
我来回答
共4个回答
热心网友
时间:2022-05-03 20:23
我的空间里面有的:
http://hi.baidu.com/yanzuoguang/blog/item/17d24d32bff2454aad4b5f83.html
SQL 2000 里面必须要主键(或者不重复的键的名字) ,假如是SQL 2005的话,可以不要.你可以参照这个原理重新写个.这个会返回两个记录集..
你可以参照下.在程序里面可以对记录集进行 next 获取下一个记录集的.具体查看一下语法吧....假如你需要更改的话.自己看不懂了就再问我...
--当下面的页代表为 -1 时,则该页面不符合条件。或者没有
create procere pro_page
@sql varchar(500), --SQL语句
@count int, --每页数量
@page int, --显示第几页
@key varchar(50) --主健
as
declare @totalcount int --总记录数
declare @totalpage int --总页数
declare @thispage int --当前页
declare @firstpage int --首页
declare @frontpage int --前一页
declare @nextpage int --后一页
declare @endpage int --最后一页
declare @tempSql nvarchar(500) --临时sql语句
declare @pos int --位置
declare @startRecord int,@endRecord int --当前页的第一条记录,和最后一条记录
set nocount on
--查询出总记录数
set @pos=CHARINDEX ('from',@sql)
set @tempSql=substring(@sql,0,7)+' @totalcount=count(*) '+substring(@sql,@pos,len(@sql))
exec sp_executesql @tempSql,N'@totalcount int output',@totalcount output
--总页数
if @totalcount%@count=0
set @totalPage=(@totalcount/@count)
else
set @totalPage=(@totalcount/@count+1)
--最尾页,当前页,下一页
if @page < @totalPage
begin
select @thispage=@page,@endPage=@totalPage,@nextpage=@page+1
end
else
begin
select @thispage=@totalPage,@endPage=-1,@nextpage=-1
end
--首页,前一页
if @thispage > 2
begin
select @firstpage=1,@frontpage=@thispage-1
end
else
begin
select @firstpage=-1,@frontpage=-1
end
--设置当前页的第一条记录,和最后一条记录
set @startRecord=(@thispage-1)*@count
if @thispage*@count < @totalcount
set @endRecord=@thispage*@count
else
set @endRecord=@totalcount
set @tempSql='select * from ('+substring(@sql,0,7)+' top '+convert(varchar(10),@endRecord)+substring(@sql,7,len(@sql))
+')tmp_table where '+@key+' not in ('
+substring(@sql,0,7)+' top '+convert(varchar(10),@startRecord)+' '+@key+' '+substring(@sql,@pos,len(@sql))
+')
execute(@tempSql)
select
@totalcount as totalcount,@count as [count],
@totalpage as totalpage,@thispage as thispage,
@firstpage as firstpage,@frontpage as frontpage,
@nextpage as nextpage,@endpage as endpage,
@endRecord as endrecord,@startRecord as startrecord
set nocount off
go
调用方法:
exec pro_page 'select * from tb_UserTypePopetom',8,11,'UTP_Id'
exec pro_page @sql='select * from tb_UserTypePopetom',@count=8,@page=11,@key='UTP_Id'
查询第11页,每页8条记录,该表主键为UTP_Id
回答上面的题目,在SQL 2000 里面必须根据排序 ,要么就是根据主键.因为SQL 2000 没有支持 except 结果集操作函数.不是高手的问题.因为这个是存在的.
但是假如是 2005 则完全没有这个问题.
select top 10 * from table
except
select top 5 * from table
这样就可以.假如2000的话,必须排序.或者设置主键.我这个存储过程已经很方便了好不.他可以直接传任何SQL ,但是条件是必须有一列必须和其他列的值都不相同.就可以..不是主键也可以的....
热心网友
时间:2022-05-03 21:41
如果一页时10条记录 那么第五页前面有40条记录
这个时候要么你在程序里做 要么在存储过程里做 把你要显示的5-10页的记录和1-4页的记录数算出来 放到查询语句里
假定一页时10条记录
40 --1-4页的记录数
60 --5-10页的记录数
select top 60 * from xx where xxx(你的其它条件)and id not in(select top 40 id from xx)
这个应该就可以了查询出来了
补充一下 如果是海量数据 就不要用这个方法了 效率太低了 要把之前的所有数据都遍历一遍 如果没有过千 还是可以的
热心网友
时间:2022-05-03 23:16
select * from(select top 【从第几行显示】* from(select not in(select top 【到第几行结束】* from 表名)from 表名))
热心网友
时间:2022-05-04 01:07
sqlserver 2005新增一个函数,except,不知道这个能不能满足你的要求,此函数就像Oracle的minus