萬能儲存過程分頁

2022-02-24 17:58:28 字數 4840 閱讀 8960

/* 

引數說明: @tblname     需要查詢的表名。如圖書表tblbooks  。如果是多表(圖書表關聯圖書分類表)則寫成: tblbooks inner join tblbooktypes on tblbooks.bookid=tblbooktypes.bookid  

@fldname      主鍵欄位名 bookid  

@listfldname  需要查詢的字段。如:書名(tblbooks.bookname)、作者(tblbooks.author)、**(tblbooks.price) 

@orderfldname 需要排序的字段。 如(tblbooks.price)  我們以非主鍵且有重複字段**字段進行排序 

-- @orderfldtype 需要排序的字段的型別。   因為price這段型別為float,所以我們這裡設定值為"float"。 

@pagesize     每頁記錄數   

@pageindex    要獲取的頁碼 

@ordertype    排序型別, 0 - 公升序, 1 - 降序 

@strwhere     查詢條件 (注意: 不要加 where)

*/create   procedure getrecordfrompage 

@tblname      varchar(500),       

@fldname      varchar(50),        

@listfldname      varchar(255),        

@orderfldname      varchar(50),        

--@orderfldtype      varchar(50),        

@pagesize     int = 10,            

@pageindex    int = 1,             

@ordertype    bit = 0,             

@strwhere     varchar(2000) = ''  

as 

declare @strsql   nvarchar(4000)       -- 主語句 

declare @strtmp   varchar(1000)       -- 臨時變數 

declare @strorder varchar(500)        -- 排序型別 

declare @strorder2 varchar(500)       --  

declare @orderfldvalue nvarchar(1000)  --排序字段對應的值   

declare @keyfldvalue nvarchar(1000)  --主鍵字段對應的值 add 

declare @operator char(1) --add by caoy 

declare @tempvaluesql varchar(100) 

declare @strorderby varchar(5) 

/*if (@orderfldtype='float') 

set @tempvaluesql='cast(@orderfldvalue as float)' 

else 

*/   set @tempvaluesql='@orderfldvalue' 

--獲取表明 。 

declare @tablename varchar(20) 

if charindex('.',@orderfldname)>1  

set @tablename=left(@orderfldname,charindex('.',@orderfldname)-1) 

else 

set @tablename=@orderfldname 

if @ordertype != 0   

begin 

set @operator='<' 

set @strorderby=' desc' 

set @strorder2=' asc' 

end 

else 

begin 

set @operator='>' 

set @strorderby=' asc' 

set @strorder2=' desc' 

end 

set @strorder=' order by '+ @orderfldname+@strorderby 

if @fldname!=@orderfldname  --如果排序字段不是主鍵字段,則增加主鍵排序 

set @strorder=@strorder+','+@fldname+@strorderby 

--先得到orderfldvalue和keyvalue  

set @strsql='select top 1 @orderfldvalue=convert(nvarchar(1000),'+@orderfldname+',20)'  /**//***注意,如果需要排序的字段的值長度超過nvarchar(1000),請修改此處***********/ 

if @fldname!=@orderfldname   

set @strsql=@strsql+',@keyfldvalue='+@fldname 

else 

set @strsql=@strsql+',@keyfldvalue=1' 

set @strsql=@strsql+' from (select top ' + str((@pageindex-1)*@pagesize) + ' ' 

+ @orderfldname  

if @fldname!=@orderfldname  --add by caoy 

set @strsql=@strsql+','+@fldname 

set @strsql=@strsql+ ' from ' + @tblname + ''  

if @strwhere != '' 

set @strsql=@strsql+ ' where '+@strwhere

set @strsql=@strsql+ @strorder + ') as '+@tablename+' order by ' + @orderfldname +@strorder2

if @fldname!=@orderfldname  --add by caoy 

set @strsql=@strsql+',' + @fldname +@strorder2

--print @strsql 

exec   sp_executesql @strsql,n'@orderfldvalue nvarchar(100) output,@keyfldvalue nvarchar(1000) output',@orderfldvalue output,@keyfldvalue output    /**//***注意,如果需要排序的字段的值長度超過nvarchar(1000),請修改此處***********/   

--得到排序字段值和主鍵值結束 

if @pageindex = 1 

begin 

set @strtmp = '' 

if @strwhere != '' 

set @strtmp = ' where (' + @strwhere + ')' 

set @strsql = 'select top ' + str(@pagesize) + ' '+ @listfldname+' from ' 

+ @tblname + '' + @strtmp + ' ' + @strorder 

exec (@strsql) 

end 

else 

begin  

--取得top資料並返回 

set @strsql = n'select top ' + str(@pagesize) +' ' +  @listfldname+' from ' 

+ @tblname + ' where ('+@orderfldname+@operator+@tempvaluesql+' and @keyfldvalue=@keyfldvalue' 

if @fldname!=@orderfldname  --add by caoy 

set @strsql=@strsql+ ' or ('+@orderfldname+'='+@tempvaluesql+' and '+@fldname+@operator+'@keyfldvalue)) and (1=1' 

if @strwhere != '' 

set @strsql=@strsql+' and ' + @strwhere 

set @strsql=@strsql+ ')'+@strorder 

if @fldname=@orderfldname          

set @keyfldvalue=1 

--print @strsql 

exec sp_executesql @strsql,n'@orderfldvalue nvarchar(1000),@keyfldvalue nvarchar(1000)',@orderfldvalue,@keyfldvalue       

end 

begin

set @strtmp=n'select count(*) from '+@tblname

if @strwhere!=''

set  @strtmp =  @strtmp+' where '+@strwhere

exec(@strtmp)

endset quoted_identifier off

go

SQL萬能儲存過程分頁

alter proc dbo proc pager tablename varchar 50 表名 refieldsstr varchar 200 欄位名 全部欄位為 orderstring varchar 200 排序字段 必須 wherestring varchar 500 n 條件語句 不用加...

SqlServer萬能分頁儲存過程

alter proc sp hangkong table nvarchar 200 表,字段,條件,field nvarchar 2000 欄位 where nvarchar 2000 條件 order nvarchar 200 排序所需要的的 pagesize int,每頁顯示的個數 pagenu...

用儲存過程萬能分頁顯示表資料

create procedure getrecordfrompage tblname varchar 255 表名 fldname varchar 255 欄位名 pagesize int 10,頁尺寸 pageindex int 1,頁碼 iscount bit 0,返回記錄總數,非 0 值則返回...