这篇文章主要围绕MSSQL分页存储过程和mysql分页存储过程展开,旨在为您提供一份详细的参考资料。我们将全面介绍MSSQL分页存储过程的优缺点,解答mysql分页存储过程的相关问题,同时也会为您带来
这篇文章主要围绕MSSQL 分页存储过程和mysql 分页存储过程展开,旨在为您提供一份详细的参考资料。我们将全面介绍MSSQL 分页存储过程的优缺点,解答mysql 分页存储过程的相关问题,同时也会为您带来GridView+分页存储过程、lnmp 环境里安装 mssql 及 mssql 的 php 扩展、lua 访问 mssql 的驱动(好用的)是哪一个?对 mysql/pgsql 的支持不错,但希望先在 mssql 能用起来、mssql server 利用 top 分页的实用方法。
本文目录一览:- MSSQL 分页存储过程(mysql 分页存储过程)
- GridView+分页存储过程
- lnmp 环境里安装 mssql 及 mssql 的 php 扩展
- lua 访问 mssql 的驱动(好用的)是哪一个?对 mysql/pgsql 的支持不错,但希望先在 mssql 能用起来
- mssql server 利用 top 分页
MSSQL 分页存储过程(mysql 分页存储过程)
本文转自 http://www.oschina.net/code/snippet_933757_33542 借鉴学习
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/*
README
Version 1.0.5
本存储过程是本人查找对比网络上常用的分页存储过程后改写的分页存储过程,拥有较高效率,但不保证效率最高。
本存储过程是在MSSQL2012上编写,不保证兼容所有版本MSSQL(已知MSSQL2005需要修改少量代码)。不兼容其他数据库。
本分页存储过程仅支持常用SQL语句。
若发现问题,请联系ttio4116@live.com,共同进步!!
版本更新:
Version 1.0.1:修复了查询第一页数据时会采用错误的SQL语句的BUG
Version 1.0.2:更新了部分参数的解释
Version 1.0.3:修复了多表查询时由于表名错误导致的出错
Version 1.0.4:去除了部分不需要的条件判断语句
Version 1.0.5:修复了第一页时GROUP BY的错误,现在可以在@FldName里面加入COUNT()、MAX()等(不限于此)聚合函数
注意:1.HAVING语句需要与GROUP BY语句配合使用,格式为:GROUP BY XXX HAVING XXX。
2.@FldSort需要给需要排序的字段设置ASC或者DESC。
3.@strOrder为排序&聚合参数,排序时在没有设置@FldSort时起作用(默认正序排列);聚合时为了计算总条数,若该参数为空时则取@FldSort的第一个字段。
4.建议@strOrder设置为主键,就算不是主键也不要包含NULL,否则会发生不可预料的结果。若该参数为空,请务必使@FldSort的第一个字段不含NULL。
*/
CREATE PROCEDURE [dbo].[MyPageRead]
(
@TblName nvarchar(3000) --连接的表名,即FROM后面的内容
,@FldName nvarchar(3000)=''*'' --要查询的字段名称,默认为全部
,@FldSort nvarchar(3000)=NULL --排序字段,不需要ORDER BY,排序自行设置,请加入ASC或者DESC
,@strCondition nvarchar(3000)=NULL --要查询的语句,不需要WHERE,前面不需要跟AND或者OR,但是不会影响计算
,@strGroup nvarchar(3000)=NULL --要聚合的语句,不需要GROUP BY
,@strHaving nvarchar(3000)=NULL --HAVING语句,不需要HAVING
,@Dist bit=0 --是否去除重复数据,0不去除/1去除
,@strOrder nvarchar(1000)=NULL --一个排序字段,当@FldSort为空时必须指定。而且该字段用于计算总条数,该字段为空时选取@FldSort的第一个字段
,@OnlyCounts bit=0 --是否只返回总条数而不进行分页
,@PageSize int=10 --每页要显示的数量
,@Page int=1 --要显示那一页的数据
,@Counts int=1 output --返回总条数
,@PageCounts int=1 output --返回总页数
)
AS
SET NOCOUNT ON --不返回计数
--定义变量
DECLARE @tmpFldSort nvarchar(3000) --构成的ORDER BY语句存放处
DECLARE @tmpstrCondition nvarchar(3000) --WHERE语句存放处
DECLARE @tmpstrGroup nvarchar(3000) --GROUP BY语句存放处
DECLARE @tmpstrfirst nvarchar(3000) --1.开头存放处,控制Dist
DECLARE @tmpstrfirstCount nvarchar(3000) --2.开头存放处,控制Dist
/*计算时间*/
DECLARE @StartTime datetime
SET @StartTime=GETDATE()
IF (@FldSort IS NULL OR @FldSort='''') AND (@strOrder IS NULL OR @strOrder='''')
RETURN
--必须有一个有值,如果有问题,直接跳出
IF @FldSort IS NULL OR @FldSort=''''
SET @tmpFldSort=@strOrder+'' ASC ''
ELSE
SET @tmpFldSort=@FldSort
--以上为设置ORDER BY语句
IF @strCondition IS NULL OR @strCondition=''''
SET @tmpstrCondition=''''
ELSE
BEGIN
IF CHARINDEX(''AND '',LTRIM(@strCondition))=1
SET @strCondition=RIGHT(@strCondition,LEN(@strCondition)-4)
IF CHARINDEX(''OR '',LTRIM(@strCondition))=1
SET @strCondition=RIGHT(@strCondition,LEN(@strCondition)-3)
SET @tmpstrCondition='' WHERE ''+@strCondition
END
--以上为设置WHERE语句
IF @strGroup IS NULL OR @strGroup=''''
SET @tmpstrGroup=''''
ELSE
BEGIN
SET @tmpstrGroup='' GROUP BY ''+@strGroup
IF @strHaving IS NOT NULL AND @strHaving<>''''
SET @tmpstrGroup=@tmpstrGroup+'' HAVING ''+@strHaving
END
--以上为设置GROUP BY语句
DECLARE @tmpFldsubstr nvarchar(1000) --排序的第一个字段,用于计算总数据量,当@strOrder无数据时有效
IF @Dist=0
BEGIN
SET @tmpstrfirst='' SELECT ''
IF @strOrder IS NULL OR @strOrder=''''
BEGIN
SET @tmpFldsubstr=LEFT(LTRIM(@FldSort),CHARINDEX(CHAR(32),LTRIM(@FldSort)))
SET @tmpstrfirstCount='' SELECT @Counts=COUNT(''+@tmpFldsubstr+'')''
END
ELSE
SET @tmpstrfirstCount='' SELECT @Counts=COUNT(''+@strOrder+'')''
END
ELSE
BEGIN
SET @tmpstrfirst='' SELECT DISTINCT ''
IF @strOrder IS NULL OR @strOrder=''''
BEGIN
SET @tmpFldsubstr=LEFT(LTRIM(@FldSort),CHARINDEX(CHAR(32),LTRIM(@FldSort)))
SET @tmpstrfirstCount='' SELECT @Counts=COUNT(DISTINCT ''+@tmpFldsubstr+'')''
END
ELSE
SET @tmpstrfirstCount='' SELECT @Counts=COUNT(DISTINCT ''+@strOrder+'')''
END
--以上通过@Dist设置@Counts
DECLARE @sqlStr nvarchar(3000) --查询的sql语句
IF @tmpstrGroup=''''
SET @sqlStr=@tmpstrfirstCount+'' FROM ''+@TblName+@tmpstrCondition
ELSE
BEGIN
SET @tmpstrfirstCount=REPLACE(@tmpstrfirstCount,''@Counts='','''')
SET @sqlStr=''SELECT @Counts=COUNT(*) FROM (''+@tmpstrfirstCount+''AS tmpF FROM ''+@TblName+@tmpstrCondition+@tmpstrGroup+'') AS tmpT''
END
EXEC sp_executesql @sqlStr,N''@Counts int out '',@Counts out --返回查找到的总数
IF @OnlyCounts=1
RETURN
--如果@OnlyCounts=1,则直接返回总条数
DECLARE @tmpCounts int
IF @Counts=0
SET @tmpCounts=1
ELSE
SET @tmpCounts=@Counts
SET @PageCounts=(@tmpCounts+@PageSize-1)/@PageSize
--以上获得分页总数
IF @Page<1
SET @Page=1
IF @Page>@PageCounts
SET @Page=@PageCounts
--以上设置分页
DECLARE @tmpsql nvarchar(3000) --设置最后要查询的SQL语句
IF @Page=1 --当取第一页时,用最快的算法
SET @tmpsql=@tmpstrfirst+'' TOP ''+CAST(@PageSize AS nvarchar(50))+'' ''+@FldName+'' FROM ''+@TblName+@tmpstrCondition+@tmpstrGroup+'' ORDER BY ''+@tmpFldSort
IF @Page>1 AND @Page<=@PageCounts/2 --这是要查询的页在总分页数的前半
BEGIN
SET @tmpsql=''WITH temptbl AS(SELECT TOP ''+CAST(@Page*@PageSize AS nvarchar(50))+'' ROW_NUMBER() OVER(ORDER BY ''+@tmpFldSort+'') AS tmpRowIndex,''+@FldName+'' FROM ''+@TblName+'' ''+@tmpstrCondition+'' ''+@tmpstrGroup+'') ''
SET @tmpsql=@tmpsql+''SELECT * FROM temptbl WHERE [tmpRowIndex] BETWEEN ''+CAST((@Page-1)*@PageSize+1 AS nvarchar(50))+'' AND ''+CAST((@Page-1)*@PageSize+@PageSize AS nvarchar(50))
END
IF @Page>1 AND @Page>@PageCounts/2 --从后面查在总分页数的后半数据
BEGIN
SET @tmpFldSort=REPLACE(@tmpFldSort,'' ASC'','' [~1]'')
SET @tmpFldSort=REPLACE(@tmpFldSort,'' DESC'','' [~2]'')
SET @tmpFldSort=REPLACE(@tmpFldSort,''[~1]'',''DESC'')
SET @tmpFldSort=REPLACE(@tmpFldSort,''[~2]'',''ASC'')
--优化后半部分数据查询,把查询条件互换,[~1]为DESC,[~2]为ASC
SET @tmpsql=''WITH temptbl AS(SELECT TOP ''+CAST(@Counts-(@Page-1)*@PageSize AS nvarchar(50))+'' ROW_NUMBER() OVER(ORDER BY ''+@tmpFldSort+'') AS tmpRowIndex,''+@FldName+'' FROM ''+@TblName+'' ''+@tmpstrCondition+'' ''+@tmpstrGroup+'') ''
SET @tmpsql=@tmpsql+''SELECT * FROM temptbl WHERE [tmpRowIndex] BETWEEN ''+CAST(@Counts-((@Page-1)*@PageSize+@PageSize-1) AS nvarchar(50))+'' AND ''+CAST(@Counts-((@Page-1)*@PageSize) AS nvarchar(50))+'' ORDER BY tmpRowIndex DESC''
END
--SELECT @tmpsql 查看拼接的字符串
EXEC sp_executesql @tmpsql
/*计算时间*/
--SELECT DATEDIFF(MS,@StartTime,GETDATE()) AS [Time]
/**/
SET NOCOUNT OFF
GridView+分页存储过程
<p>存储过程中的参数可以只有2个:第几页和每页的行数总行数的可以使用简单的SELECT COUNT(1) FROM TableName来完成,总页就是总行数/每页的行数。把这几个算出来的数填充到GridView相应的属性中。当点第几页的时候,再调用分页存储过程来刷新数据,就可以了。 群主(87273411) 09:34:52create PROCEDURE Sp_Conn_Sort(@tblName varchar(255), -- 表名
<p>@strGetFields varchar(1000) = '', -- 需要返回的列
<p>@fldName varchar(255)='', -- 排序的字段名
<p>@PageSize int = 40, -- 页尺寸
<p>@PageIndex int = 1, -- 页码
<p>@doCount bit = 0, -- 返回记录总数,非 0 值则返回
<p>@OrderType bit = 0, -- 设置排序类型,非 0 值则降序@strWhere varchar(1500)='' -- 查询条件 (注意: 不要加 where))AS
<p>declare @strsql varchar(5000) -- 主语句
<p>declare @strTmp varchar(110) -- 临时变量
<p>declare @strOrder varchar(400) -- 排序类型
<p>
<p>if @doCount != 0
<p> begin
<p> if @strWhere !=''
<p> set @strsql = 'select count() as Total from ' + @tblName + ' where <a href="mailto:'+@strWhere">'+@strWhere
<p> else
<p> set @strSQL = 'select count() as Total from ' + @tblName
<p> end
<p>--以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况
<p>else
<p>begin
<p>
<p>if @OrderType != 0
<p>begin
<p> set @strTmp = '<(select min'
<p>set @strOrder = ' order by ' + @fldName +' desc'
<p>--如果@OrderType不是0,就执行降序,这句很重要!
<p>end
<p>else
<p>begin
<p> set @strTmp = '>(select max'
<p> set @strOrder = ' order by ' + @fldName +' asc'
<p>end
<p>
<p>if @PageIndex = 1
<p>begin
<p> if @strWhere != ''
<p> set @strSQL = 'select top ' + str(@PageSize) +' <a href="mailto:'+@strGetFields">'+@strGetFields+ ' from ' + @tblName + ' where ' + @strWhere + ' ' + @strOrder
<p> else
<p> set @strsql = 'select top ' + str(@PageSize) +' <a href="mailto:'+@strGetFields">'+@strGetFields+ ' from '+ @tblName + ' '+ @strOrder
<p>--如果是第一页就执行以上代码,这样会加快执行速度
<p>end
<p>else
<p>begin
<p>--以下代码赋予了@strSQL以真正执行的SQL代码
<p>set @strSQL = 'select top ' + str(@PageSize) +' <a href="mailto:'+@strGetFields">'+@strGetFields+ ' from '
<p> + @tblName + ' where ' + @fldName + '' + @strTmp + '('+ @fldName + ') from (select top ' + str((@PageIndex-1)@PageSize) + ' '+ @fldName + ' from ' + @tblName + '' + @strOrder + ') as tblTmp)'+ @strOrder
<p>
<p>if @strWhere != ''
<p> set @strsql = 'select top ' + str(@PageSize) +' <a href="mailto:'+@strGetFields">'+@strGetFields+ ' from '
<p> + @tblName + ' where ' + @fldName + '' + @strTmp + '('
<p> + @fldName + ') from (select top ' + str((@PageIndex-1)*@PageSize) + ' '
<p> + @fldName + ' from ' + @tblName + ' where ' + @strWhere + ' '
<p> + @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder
<p>end
<p>end
<p>exec (@strsql) 群主(87273411) 09:35:07
lnmp 环境里安装 mssql 及 mssql 的 php 扩展
小活中用到 mssql, 于是在自己 lnmp 环境中安装各 mssql 数据库
步骤如下:
源码编译安装
# tar zxvf freetds-stable.tgz(解压,)
# cd freetds-0.91
# 编译
# ./configure --prefix=/usr/local/freetds --with-tdsver=8.0 --enable-msdblib
# make
# make install
参数解释:
安装 freetds 到目录 /usr/local/freetds:--prefix=/usr/local/freetds
支持 MSSQL2000:--with-tdsver=8.0 --enable-msdblib
配置 FreeTds 的库文件
将 freetds 的库文件所在路径配置到 LD_LIBRARY_PATH 参数中:
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/localfreetds/lib/:
或者直接把 etc/bashrc 的文件 bashrc 直接填写上 LD_LIBRARY_PATH=/usr/localfreetds/lib:$LD_LIBRARY_PATH
这么作的目的是为了避免加载 FreeTds 库文件加载不上的情况。
php 里安装 php-mssql 扩展:
cd /download (把php-mssql扩展下载到download目录里)
wget http://cn2.php.net/distributions/php-5.6.30.tar.gz (下载扩展文件,这里要根据你环境中运行的php版本选择对应的扩展版本下载,我这里php是5.6.30的 所以php-mssql扩展下载对应的版本)
tar -zxvf php-5.6.30.tar.gz
cd /php-5.6.30/ext/mssql
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --with-mssql=/usr/local/freetds/
make && make install
编译安装后的结果 如下图
同时 mssql.so 也在 php 扩展文件下生成 (如下图)
把 extension="/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/mssql.so" 添加到 usr/local/php/lib/php.ini 中
引用扩展后,重启 web 服务,通过 phpinfo 查看扩展 mssql 是否开启成功
重启 php /usr/local/php/sbin/php-fpm reload
重启 nginx 进入 nginx 可执行目录 sbin 下,输入命令./nginx -s reload 即可(或者 /application/nginx/sbin/nginx -s reload)
lua 访问 mssql 的驱动(好用的)是哪一个?对 mysql/pgsql 的支持不错,但希望先在 mssql 能用起来
lua 访问 mssql 的驱动(好用的)是哪一个?
lua 对 mysql/pgsql 的支持不错,但对 mssql 的访问,总是不太顺
而目前希望先在 mssql 能用起来
mssql server 利用 top 分页
pagesize: 每页显示记录数cureentpage:当前页数
select top pagesize * from (select top pagesize*cureentpage * from user_table order by id asc ) as asystable order by id desc)
我们今天的关于MSSQL 分页存储过程和mysql 分页存储过程的分享就到这里,谢谢您的阅读,如果想了解更多关于GridView+分页存储过程、lnmp 环境里安装 mssql 及 mssql 的 php 扩展、lua 访问 mssql 的驱动(好用的)是哪一个?对 mysql/pgsql 的支持不错,但希望先在 mssql 能用起来、mssql server 利用 top 分页的相关信息,可以在本站进行搜索。
本文标签: