这是我自已写的二分法存储过程想知道哪里还需改进
1
set ANSI_NULLS ON2
set QUOTED_IDENTIFIER ON3
go4

5
ALTER PROCEDURE [dbo].[GetRecordFromPage] 6
@tblName nvarchar(255), -- 表名7
@FieldKey nvarchar(250)='', --表主键8
@RetColumns nvarchar(1000) = '*', -- 需要返回的列,默认为全部 9
@Orderfld nvarchar(255)='', -- 排序字段名 10
@PageSize int = 10, -- 页尺寸 11
@PageIndex int = 1, -- 页码 12
@IsCount bit = 0, -- 返回记录总数, 非 0 值则返回 13
@OrderType nvarchar(50) = 'asc', -- 设置排序类型, 非 asc 值则降序 14
@strWhere nvarchar(1000) = '' , -- 查询条件 (注意: 不要加 where)15
@SizeId int =0 --总数16
AS17
declare @IsOrderType nvarchar(255)18
declare @OrderfldSQL nvarchar(255) 19
declare @strWhereSQLand nvarchar(1000) 20
declare @strWhereSQLwhere nvarchar(1000) 21
declare @RetColumnsSQL nvarchar(255) 22
declare @strSQL nvarchar(1000) 23
declare @SizeSQL int24
if @IsCount != 0 --执行总数统计25
begin26
set @strSQL = 'select count(1) as Total from ['+@tblName+']'27
if @strWhere != '' 28
begin 29
set @strSQL = @strSQL+ ' where ' + @strWhere 30
end31
end32
else --执行查询操作33
begin34
if @OrderType !=''35
begin36
set @SizeSQL=0;37
set @IsOrderType=@OrderType;38
end39
else40
begin41
set @OrderType='asc'42
set @IsOrderType='asc'43
end44
if @SizeId!=045
begin46
if @SizeId/2>@PageSize*(@PageIndex-1)47
begin48
set @SizeSQL=@PageSize*(@PageIndex-1)49
end50
else51
begin52
set @SizeSQL=@SizeId-@PageSize*(@PageIndex-1)-@PageSize;53
if @OrderType!='asc'54
begin55
set @OrderType='asc';56
end57
else58
begin59
set @OrderType='desc';60
end61
end62
end63
else64
begin65
set @SizeSQL=@PageSize*(@PageIndex-1)66
end67

68
if @RetColumns !=''69
begin70
set @RetColumnsSQL=@RetColumnsSQL+@RetColumns+' ';71
end72
else73
begin74
set @RetColumnsSQL='* ';75
end76
if @strWhere!=''77
begin78
set @strWhereSQLand='and '+@strWhere+' ';79
set @strWhereSQLwhere='where '+@strWhere+' ';80
end81
else82
begin 83
set @strWhereSQLand=' ';84
set @strWhereSQLwhere=' ';85
end86
if @Orderfld!=''87
begin88
set @OrderfldSQL='order by '+@Orderfld+' '+@OrderType+' ';89
end90
else91
begin 92
set @OrderfldSQL='order by '+@FieldKey+' '+@OrderType+' ';93
end94
if @SizeSQL<095
begin 96
set @PageSize=@PageSize-@SizeSQL*(-1);97
set @SizeSQL=098
end99

100
if @IsOrderType=@OrderType101
begin102
set @strSQL='select top '+str(@PageSize)+' '+@RetColumnsSQL+' from ['+@tblName+'] where ['+@FieldKey+'] not in (select top '+str(@SizeSQL)+' ['+@FieldKey+'] from ['+@tblName+'] '+@strWhereSQLwhere+' '+@OrderfldSQL+') '+@strWhereSQLand+' '+@OrderfldSQL;103
end104
else105
begin106
set @strSQL='select * from ['+@tblName+'] where ['+@FieldKey+'] in ( select top '+str(@PageSize)+' ['+@FieldKey+'] from ['+@tblName+'] where ['+@FieldKey+'] not in (select top '+str(@SizeSQL)+' ['+@FieldKey+'] from ['+@tblName+'] '+@strWhereSQLwhere+' '+@OrderfldSQL+') '+@strWhereSQLand+' '+@OrderfldSQL+') order by '+@FieldKey+' '+@IsOrderType;107
end108
end109

110
exec (@strSQL)111
print @strSQL112

浙公网安备 33010602011771号