问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

在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
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
纯种萨摩和不纯的萨摩的区别 不是纯种萨摩,长大成型后和纯种萨摩外表一样吗 学播音主持和配音哪个更赚钱,各有各的长处 学播音真的能改变声音吗,会让自己的普通话更加标准 学习播音和配音的作用,可以提升自信和气质 普通人学配音有没有用,有兴趣则有用 什么是永诚财产保险股份有限公司 win10电脑升级不了ie11win10怎么升级ie11 电脑硬件保修哪些电脑硬件保修包括什么 电脑固态硬盘质保几年一般的电脑保修时间是多久 vb中,如何将SQLServer中的SQL记录集转化为XML,并用到treeview控件中来? sqlserver查询:一张表,根据id查询出来两条数据,现在需要将这两条数据的某列合成一列显示,该怎么做? sqlserver语句查询,如何将相同条件的某列数据显示到一行? bcp怎么导出一个表数据为带列名的csv格式文件 bcp文件的参数含义 请问 服务器在备份数据、导入导出数据时候 大概是怎样操作流程的? 1.sql server允许用户在 和 之间大容量地导入及导出数 在sybase中怎么用bcp导入数据??? 在sybase中怎么用bcp导出数据 sql convert 函数在c++中怎么使用???大神请教! SQL中convert转换问题 SQL:convert类型转换 sql2000里convert函数 SQL CONVERT 函数使用问题 sql convert函数 打开本地安全策略,显示&quot;MMC不能打开文件C:&#92;WINDOWS&#92;system32&#92;secpol.msc&quot;怎么解决 MMC不能打开文件%SYSTEMDRIVE%&#92;WINDOWNS&#92;SYSTEM32&#92;devmgmt.msc 怎么 解决 我在进行硬盘碎片整理时,它说什么&quot;MMC不能打开文件C&#92;WINDOWS&#92;SYSTEM32&#92;DFRG.MSC 我开任务管理器的时候打不开。弹出:MMC 不能打开文件 C:&#92;WINDOWS&#92;system32&#92;devmgnt.msc MMC 不能打开文件C:\\WINDOWS\\system32\\devmgmt.msc。 错误 18483:未能连接到服务器 &quot;XXX&quot;,因为 &#39;distributor_admin&#39;未在该服务器上定义为远程登陆 select SERVE 它上面显示“未进行远程连接,因为远程访问服务器的名称问题没有解决” 桌面总是跳出获取版本错误,无法连接到远程服务器,怎么办 无法自动进入并单步执行服务器,未能连接到服务器计算机怎么解决 那为啥电脑网络连接显示无法及时启动远程访问服务器服务?点击网络连接的属性显示发射意外错误, 错误代码815,提示电脑提示无法在计算机上建立宽带网络连接,因为远程服务器未响应是什么原因 Win10连接失败未进行远程连接,因为远程访问服务器的名称问题没有解决 有谁知道扩展存储过程xp 如何在自己建的数据库中调用扩展存储过程 存储过程是什么?怎么做? 带参数的ms sql server的扩展存储过程,怎么传递参数 C#如何调用SQL2000扩展存储过程? 怎样把系统存储存到内部存储过程 本台电脑SQL SERVER 2000 的服务器 如何与另一台电脑的SQL SERVER 2000服务器同步 SQL server 2000 如何多服务器同步数据 写出下列SQL语句,简单的表查询语句 Orcle 按一定的分类,取出表中,各类的前几条数据 的sql语句 sql返回活动的最后一条生成的所有订单,帮我写条查询语句 帮忙写句SQL语句 求统计人员在每个城市的活动情况(排序)的SQL语句