/*
引數說明: @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 值則返回...