laifangsong's blog

取长补短,精益求精。 (打个广告,想做手机网站和asp/asp.net网站的可以跟我联系.QQ:25313644)
posts - 51, comments - 185, trackbacks - 0, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

我的评论

共3页: 1 2 3 下一页 
楼主,我的分页存储过程和你的类似,但没要求排序的字段必须是主键




/****** 对象: 存储过程 dbo.sp_Paging 脚本日期: 2007-11-27 9:43:17 ******/




/****** 对象: 存储过程 dbo.sp_Paging 脚本日期: 2007-4-27 13:19:03 ******/

/*
分页存储过程(来源于网络,经过修改以适应多表联合查询)

注意:该存储过程和和网络上其他分页存储过程一样,存在经典的SQL注入漏洞; 不论在asp/asp.net等中调用时,
都要把 @strWhere参数中的非法字符(逗号过滤掉)
*/

CREATE PROCEDURE sp_Paging
@tblName varchar(255) , -- 表名
@strGetFields varchar(1000) = '*', -- 需要返回的列
@fldName varchar(255)='', -- 主关键字字段名
@orderfield varchar(255)='', -- 排序的字段名
@pageSize int = 10, -- 页尺寸
@pageIndex int = 1, -- 页码
@recordCount int = 0 output, -- 返回记录总数
@pageCount int = 0 output, --分页总数
@orderType int = 0, -- 设置排序类型, 非 0 值则降序
@strWhere varchar(1500) = '' -- 查询条件 (注意: 不要加 where)
AS
declare @strSQL nvarchar(3000) -- 主语句
declare @strTmp varchar(110) -- 临时变量
declare @strOrder varchar(400) -- 排序类型

begin
if @strWhere !=''
set @strSQL = 'select @recordCount = count(*) from ' + @tblName + ' where '+@strWhere
else
set @strSQL = 'select @recordCount = count(*) from ' + @tblName
end

exec sp_executesql @strSQL,N'@recordCount int out ',@recordCount out

if @recordCount % @pageSize = 0
set @pageCount = @recordCount / @pageSize
else
set @pageCount = @recordCount / @pageSize + 1
--以上代码的意思是计算出记录是总数和求出总共的页数

begin
if @orderType != 0
begin
set @strTmp = '<(select min'
set @strOrder = ' order by ' + @orderfield +' desc'
--如果@orderType不是0,就执行降序,这句很重要!
end
else
begin
set @strTmp = '>(select max'
set @strOrder = ' order by ' + @orderfield +' asc'
end

if @pageIndex = 1
begin
if @strWhere != ''

set @strSQL = 'select top ' + str(@pageSize) +' '+@strGetFields+ ' from ' + @tblName + ' where ' + @strWhere + ' ' + @strOrder
else

set @strSQL = 'select top ' + str(@pageSize) +' '+@strGetFields+ ' from '+ @tblName + ' '+ @strOrder
--如果是第一页就执行以上代码,这样会加快执行速度
end
else
begin
if @strWhere != ''
set @strSQL = 'select top ' + str(@pageSize) +' '+@strGetFields+ ' from '
+ @tblName + ' where ' + @fldName + '' + @strTmp + '('
+ substring(@fldName, charindex('.',@fldName)+1, len(@fldName)) + ') from (select top ' + str((@pageIndex-1)*@pageSize) + ' '
+ @fldName + ' from ' + @tblName + ' where ' + @strWhere + ' '
+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder
else
set @strSQL = 'select top ' + str(@pageSize) +' '+@strGetFields+ ' from '
+ @tblName + ' where ' + @fldName + '' + @strTmp + '('
+ substring(@fldName, charindex('.',@fldName)+1, len(@fldName)) + ') from (select top ' + str((@pageIndex-1)*@pageSize) + ' '
+ @fldName + '  from ' + @tblName + '' + @strOrder + ') as tblTmp)'
+ @strOrder
end
end
print @strSQL
exec sp_executesql @strSQL

GO
re: 你的胸怀是被谁撑大的? laifangsong 2007-11-02 00:01  
这篇文笔很好

读起来相当舒服!
我没在这家公司
所以没办法回答你,如果你有去面试的话,祝你好运:)
re: 常用SQL语句(整) laifangsong 2007-09-24 18:39  
回楼上的朋友:
你没注意到后面有 group by field1,field2
是每组只剩一条记录
re: 不错的分页存储过程(转) laifangsong 2007-09-19 12:46  
if @pageIndex > @pageCount
set @pageIndex = @pageCount
re: 不错的分页存储过程(转) laifangsong 2007-09-18 17:49  
回楼上:
这个存储过程是别人写的,我只是修改了他的代码而已
不论是技术、人品和意志力,都值得敬佩和学习
re: 看似诡异的session赋值错误 laifangsong 2007-09-05 18:20  
是 !=
我写错了,马上改下
re: 今天向我女朋友求婚了~ laifangsong 2007-08-17 13:48  
有点佩服你了,脸皮确实有点”厚“,哈哈
re: 我希望自己是个医生 laifangsong 2007-08-17 13:41  
对比楼主文章中说到的每个点,我们公司里基本能找到一个对应的

好文章。
re: 数据库团队欢迎你的加入 laifangsong 2007-08-13 15:16  
laifangsong
laifangsong@gmail.com
http://jiny-z.cnblogs.com/

申请加入。
re: 我也谈谈这个执行力吧 laifangsong 2007-08-08 15:01  
@佚名
如果苏老大文章写的很差,就算他跟bill gate差不多NB,估计也没什么人拍“马屁”吧。应该可以说是对他观点的赞同和文章的肯定吧。
@fffly
对啊,有时候小问题,大学问,呵呵
@silent x
好像蛮长的,我看看;)
@周银辉
确实挺费时间的,我算法较差,非递归真的写不出来,我看看你的算法。
re: asp/asp.net中遍历树型结构. laifangsong 2007-08-07 12:16  
@海洋
本次查询的ID做为下次的ParentID
@123
检查图片路径,注意要用相对路径
@ddy
你说的我也不懂怎么实现,估计不行。就算你发过去的标题是链接,邮件服务器也会做处理的,因为他一般要保证点着该链接可以到邮件正文。
@superstar
可能是你的smtp服务器设置有问题,例:163的smtp是 smtp.163.com
另外,调用例子中的邮箱地址和登录密码,要改成你自己的。
re: 狙击艾滋病,共同努力 laifangsong 2007-07-09 08:13  

汗。这东西都有!

楼主的 51aspx.com上面的源码真的不错,没有死链,下载下来的压缩包里的数据也比较完整。

我下了几个不错的代码。MS mvp liuwei写的个人blog站点代码和一个仿codeproject论坛的代码,都很不错。

但是,网站上老外写的代码比较少(是不是因为翻译比较困难),即使有,放在网站上也不容易找到。建议楼主把老外写的源码单独列一块,其中比较好的做个推荐的标识就更好了。



分析的很全面,:)

总结的很好。

不错。
re: 下周将去北京寻找投资 laifangsong 2007-06-29 14:57  

只要是学.net的,应该没有人不知道博客园的。

祝顺利。
re: 不喜欢数据库编程 laifangsong 2007-06-26 09:05  
@kiler
分页写成存储过程,这两个也算原因吧:

1.分页程序逻辑上独立,一般写好后不需要做修改,做为存储过程放在数据库中就是独立的一个文件,使用方便又带来些效率上的提升。
2.分页存储过程独立于语言之外,写好后放在数据库中,不管是asp.net/asp/java...,只要写一次。
re: 欢迎加入 Visual Basic 团队 laifangsong 2007-06-25 08:20  

听说楼主才14岁,惊讶...

我虽然不做vb.net开发,也帮你捧个场。
re: 服务器已经成功搬迁到新机房 laifangsong 2007-06-25 08:08  

不论我还公司还是在家里访问博客园,都比以前快多了,真好。
re: 麻烦大家测试一下新机房的网速 laifangsong 2007-06-25 08:07  

电信lan 10M宽带 下载平均300k左右.
re: 经营分析工作总结 laifangsong 2007-06-20 17:19  
(这段应该好好写)

谢谢党和国家给我这么一个大环境,让我可以安居,让我可以娶妻生子,更重要的是让我可以在三个代表的光辉下茁壮成长。

感谢那些给我无穷压力也被我无数次暗骂的客户们:贵州联通、广西联通、云南联通、重庆移动、江西移动、浙江移动、吉林移动、天津电信、河北移动、山东移动。没有他们的刻薄,我也无法作出这个东西。


//太搞笑了。
re: 迅速把握需求要点? laifangsong 2007-06-20 17:17  

对你有点帮助呢?

//有:)

这东西跟 网页上的那种 “QQ客服” 相比,不知道有什么优势?:)

聊天的内容不知道会不会保存在 提供服务 的提供商的数据库中?

共勉。

楼主还是不错的了。

面试的时候准备不充分是难免的,但作品至少应该拿的出手,自己做的,跟应聘的工作有关,运行的起来。

第16点以前都不知道,:)
re: 滥用存储过程的思考 laifangsong 2007-06-15 11:20  
@henry
先向博主道个歉,我确实没有测试过 50w在datareader中循环的速度,只是感觉慢。

你说的 “p4 1.8 512m 的电脑通过索引分页对100W记录拿任何一页都是秒杀”,在单机上测试出现这个结果应该也没什么问题。

但是分页程序放在网络上n人同时访问时,n次的100w访问,是要消耗很多内存的。

存储过程可以做到“按需去取”,datareader却不能,差别就在这里。
re: 滥用存储过程的思考 laifangsong 2007-06-15 00:11  

首先是数据少,不具有代表性。数据量较大时(比如50万条),不敢想象点击到最后一页时,datareader里做了50w次循环要花多少时间。

其次,用创建临时表方法很不可取,虽然创建临时表对 各种有查询条件的分页存储过程支持的比较好(比如 文章列表分页,要实现文章置顶有些比较高效的分页存储过程不能用),但创建临时表消耗了很多内存和时间,完全可以用

2个 top 的写法代替,相信效果也比测试中的数据要好的多。

今天已收到通知了,可以去上班,:0)

很牛B的一篇文章.......
re: 贱货 黑人 家丑 laifangsong 2007-06-10 22:44  

博主处理的很恰当,佩服!!
re: 项目开发经验谈(一) laifangsong 2007-05-23 09:27  

好文。

厉害干系人部分说的挺好。

楼主可以在该虚拟目录下,建一个 .html或者 .asp的文件,看看能不能正常访问。

如果正常,说明 iis6解释 asp.net的时候才出了问题,再继续查查原因。
re: 网速测试[未登录] laifangsong 2007-05-17 09:01  
250K左右,

福建福州电信LAN 10M
re: javascript分页 laifangsong 2007-05-14 11:51  
挺特别的。
re: 我也说说王开源吧 laifangsong 2007-04-27 08:33  
一流人才,一流口才!:):(
re: 您未必知道的Js技巧 laifangsong 2007-04-23 09:00  
好东西。
re: 学会对客户说“不”! laifangsong 2007-04-22 21:28  
好文章。
re: 不错的分页存储过程(转) laifangsong 2007-04-13 09:20  

试了下,发现确实可以注入。

其实很多分页存储过程TSQL语句都是这样写的,基本都有注入问题。
declare @sqlstr
set @sqlstr = '...'
exec(@sqlstr )
/*
先 生成一个大的sql语句串,再调用执行;如果查询条件中传入逗号,逗号全部变成执行语句的一部分了,注入漏洞就出现了。
即使在asp.net中,通过sqlparam那种形式构建参数,还是免不了sql注入
*/
或者
exec sp_executesql(@sqlstr)


防止注入:

1.
如果不是构造成大的sql语句串来执行,就不会有注入问题。
例如:
select * from admin where username=@username and password=@password

2.参数传入之前先过滤
//过滤提交的非法字符串(防止sql注入)
public static string GetSafeStr(string str)
{
return str.Replace("'", "").Replace("\"", "").Replace(":", "");
}
re: asp.net获取URL和IP地址 laifangsong 2007-04-11 10:50  
good!
re: 团队建设(4)-天下没有不散的筵席 laifangsong 2007-04-01 01:20  

您的团队令我羡慕。
周平均访问量总是在上升,不错啊。
共3页: 1 2 3 下一页