菜鸟先飞

导航

统计

公告

最新评论

最好能够有具体的测试代码
“最近文档写了不少,导致Word和Excel的使用能力飞一般成长。”----哈哈哈
呵呵。受教了。最近更在考虑是用学习linq还是ef,看了博主的文章这下明了啦。谢谢.
不错,谢谢了
存储过程一般都是经过预编译的,如果拼接的话,预编译的只会是拼接的过程,执行拼接后的结果需要再编译一次,我个人认为这个编译过程的性能下降相对于数据的检索是很微小。

当然也欢迎大家的不同意见
@pythonic
拼接字符串相对与不拼接肯定是低效的,但是影响有多大,不知道
@xcb_isgreat
请告诉我为什么拼接字符串不高效?
写存储过程有个重要的原因是为了更好的使用sql的执行计划,这样可以降低sql的编译成本 ,以上动态sql,写成存储过程,实在是没什么高效可言,如果是高效,我想最多是开发上的高效 , 如果大家有通用的存储过程分页[非拼接sql字符串],麻烦你给我发到邮箱里chenxumi@hotmail.com存储过程分页[非拼接sql字符串],自己设了好多次,都没开发成功
re: 对任意select语句进行分页的通用存储过程(SQL2005) 路人甲乙丙丁~~~~~~~~~~~~ 2009-03-18 14:03  
这是我的分页存储过程,2000和2005通用,我这段存储过程可以做优化,有兴趣的可以自己修改下

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go




ALTER PROCEDURE [dbo].[UP_Search]
(
@PageIndex INT,--当前页
@PageSize INT,--页大小
@SortField nVARCHAR(100), --排序字段
@SortType nVARCHAR(10),--排序类别
@TableName nVARCHAR(100),--表名
@StrWhere nVARCHAR(1000),--搜索条件
@FieldsList varchar(500),--返回的字段列表
@TotalCount INT OUTPUT--一共有几条
)
AS
DECLARE @fromRec INT
DECLARE @toRec INT
DECLARE @reccount INT
Declare @Is2000 int

SET @fromRec=(@pageindex-1)*@pagesize+1
SET @toRec=@fromRec+@pagesize-1
--select convert(varchar(2),@fromrec)

DECLARE @sqlSelect nVARCHAR(1000)
DECLARE @sqlcount nvarchar(1000)
declare @keyfields nvarchar(100)


select @Is2000=convert(int,charindex('Server 2005',@@version,1))
if @Is2000>0 --数据库是2005版本
begin
SET @sqlselect='select '+@fieldslist+', row_number() over (order by '+@sortfield+' '+@sorttype+' ) as row from ' + @tablename +' where 1=1 ' + @strwhere
SET @sqlselect='select * from (' + @sqlselect +') t1 where row>=' +convert(varchar(10),@fromRec)+ ' and row<=' + convert(varchar(10),@torec)
end
else --数据库是2000及以下版本
begin

--获取关键字段名称
if exists (select * from syscolumns where colstat=1 and id=(select id from Sysobjects where Upper(name) =Upper(@tablename)))
select @keyfields=name from syscolumns where colstat=1 and id=(select id from Sysobjects where Upper(name) =Upper(@tablename))
else
set @keyfields=@sortfield



select @keyfields=isnull(name,@SortField) from syscolumns where colstat=1 and id=(select id from Sysobjects where Upper(name) =Upper(@tablename))


set @sqlselect='select top '+convert(varchar(10),@pagesize)+' * from '+@TableName+' where '+@keyfields+' not in(select top '+convert(varchar(10),@toRec-@pagesize)+' '+@keyfields+' from '+@tablename+') '+@StrWhere

end


SET @sqlcount='select @a=count(1) from '+@tablename+' where 1=1 ' + @strwhere
EXEC sp_executesql @sqlcount,N'@a INT output',@reccount output
SET @TotalCount=@reccount
EXEC(@sqlselect)



呵呵啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
这是不是真的?我最近也打算写篇博客介绍这个存储过程,并附带一些例子,其实这个存储过程就是微软自带的示例数据库AdventureWorks中的一个存储过程,不过这样的分页方法的确既通用又高效,值得在项目中使用……
LINQ skip.take流路过
感谢 苏康胜 老兄,这个问题我也考虑到了,可是对于网页而言很多地方需要分页,这是一个性能和开发效率的权宜之计,这个存储过程也有很多需要改进的地方

思路不错,学些了。

但在有些使用场景时要注意,在楼主的代码里看到存储过程里先把SQL语句插入到临时表里,如果SQL语句返回的记录数非常多的情况下对内存和CPU的压力可能比较大,还有如果SQL语句的查询计划并不优化的话,性能不一定非常好。

对于非常多普通的SQL语句来说,这个是一个非常不错的分页方式,复杂逻辑的SQL语句,有时候通过程序的算法去优化SQL语句的查询计划更有效。

一点个人的看法,如有不对之处,请见谅

(E8.Net) http://www.feifanit.com.cn