发布网友 发布时间:2022-04-23 05:03
共1个回答
热心网友 时间:2023-08-17 05:42
分页存储过程如果按主键来排序,速度还是比较快的,但是如果按照LIKE条件查询字符串,那速度会下降很多,排序字段是个非常关键的因素,提供一个存储过程,调用这个存储赛程就可以了,参考如下:CREATEPROCproc_pageview@tbnamesysname,--要分页显示的表名@FieldKeynvarchar(1000),--用于定位记录的主键(惟一键)字段,可以是逗号分隔的多个字段@PageCurrentint=1,--要显示的页码@PageSizeint=10,--每页的大小(记录数)@FieldShownvarchar(1000)='',--以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段@FieldOrdernvarchar(1000)='',--以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC@Wherevarchar(1000)='',--查询条件@RecordCountintOUTPUT--总页数ASSETNOCOUNTON--检查对象是否有效IFOBJECT_ID(@tbname)ISNULLBEGINRAISERROR(N'对象"%s"不存在',1,16,@tbname)RETURNENDIFOBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTable')=0ANDOBJECTPROPERTY(OBJECT_ID(@tbname),N'IsView')=0ANDOBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTableFunction')=0BEGINRAISERROR(N'"%s"不是表、视图或者表值函数',1,16,@tbname)RETURNEND--分页字段检查IFISNULL(@FieldKey,N'')=''BEGINRAISERROR(N'分页处理需要主键(或者惟一键)',1,16)RETURNEND--其他参数检查及规范IFISNULL(@PageCurrent,0)0SELECT@Field=LEFT(@s,CHARINDEX(N',',@s)-1),@s=STUFF(@s,1,CHARINDEX(N',',@s),N''),@Where1=@Where1+N'ANDa.'+@Field+N'=b.'+@Field,@Where2=@Where2+N'ANDb.'+@Field+N'ISNULL',@Where=REPLACE(@Where,@Field,N'a.'+@Field),@FieldOrder=REPLACE(@FieldOrder,@Field,N'a.'+@Field),@FieldShow=REPLACE(@FieldShow,@Field,N'a.'+@Field)SELECT@Where=REPLACE(@Where,@s,N'a.'+@s),@FieldOrder=REPLACE(@FieldOrder,@s,N'a.'+@s),@FieldShow=REPLACE(@FieldShow,@s,N'a.'+@s),@Where1=STUFF(@Where1+N'ANDa.'+@s+N'=b.'+@s,1,5,N''),@Where2=CASEWHEN@Where=''THENN'WHERE('ELSE@Where+N'AND('END+N'b.'+@s+N'ISNULL'+@Where2+N')'--执行查询EXEC(N'SELECTTOP'+@TopN+N''+@FieldShow+N'FROM'+@tbname+N'aLEFTJOIN(SELECTTOP'+@TopN1+N''+@FieldKey+N'FROM'+@tbname+N'a'+@Where+N''+@FieldOrder+N')bON'+@Where1+N''+@Where2+N''+@FieldOrder)ENDGO