自開始做專案以來,一直在用。這段儲存過程的的原創者(sorry,忘記名字了),寫得這段sql**很不錯,我在這個基礎上,按照我的習慣以及思維方式,調整了**,只做分頁查詢用。
create procedure prcpageresult
-- 獲得某一頁的資料 --
@currpage int = 1, --當前頁頁碼 (即top currpage)
@showcolumn varchar(2000) = '*', --需要得到的字段 (即 column1,column2,......)
@tabname varchar(2000), --需要檢視的表名 (即 from table_name)
@strcondition varchar(2000) = '', --查詢條件 (即 where condition......) 不用加where關鍵字
@asccolumn varchar(100) = '', --排序的欄位名 (即 order by column asc/desc)
@bitordertype bit = 0, --排序的型別 (0為公升序,1為降序)
@pkcolumn varchar(50) = '', --主鍵名稱
@pagesize int = 20 --分頁大小
asbegin -- 儲存過程開始
-- 該儲存過程需要用到的幾個變數 --
declare @strtemp varchar(1000)
declare @strsql varchar(4000) --該儲存過程最後執行的語句
declare @strordertype varchar(1000) --排序型別語句 (order by column asc或者order by column desc)
begin
if @bitordertype = 1 -- bitordertype=1即執行降序
begin
set @strordertype = ' order by '+@asccolumn+' desc'
set @strtemp = '<(select min'
endelse
begin
set @strordertype = ' order by '+@asccolumn+' asc'
set @strtemp = '>(select max'
endif @currpage = 1 -- 如果是第一頁
begin
if @strcondition != ''
set @strsql = 'select top '+str(@pagesize)+' '+@showcolumn+' from '+@tabname+
' where '+@strcondition+@strordertype
else
set @strsql = 'select top '+str(@pagesize)+' '+@showcolumn+' from '+@tabname+@strordertype
endelse -- 其他頁
begin
if @strcondition !=''
set @strsql = 'select top '+str(@pagesize)+' '+@showcolumn+' from '+@tabname+
' where '+@strcondition+' and '+@pkcolumn+@strtemp+'('+@pkcolumn+')'+' from (select top '+str((@currpage-1)*@pagesize)+
' '+@pkcolumn+' from '+@tabname+@strordertype+') as tabtemp)'+@strordertype
else
set @strsql = 'select top '+str(@pagesize)+' '+@showcolumn+' from '+@tabname+
' where '+@pkcolumn+@strtemp+'('+@pkcolumn+')'+' from (select top '+str((@currpage-1)*@pagesize)+' '+@pkcolumn+
' from '+@tabname+@strordertype+') as tabtemp)'+@strordertype
endend
exec (@strsql)
end -- 儲存過程結束
go
呼叫方法:
prcpageresult 1,'*','tablename','','createdate',1,'pkid',25
上面表示,查詢表tablename的所有字段,前25條記錄,因為是第一頁,排序欄位為createdate,降序排列,主鍵是pkid。這個儲存過程的功能比較強大,用在專案中非常的適用。不信您可以試試看,尤其是在百萬級資料上,他的優勢就顯露無疑了,當然,這段**是可以轉換成mysql中的儲存過程的,不過,在這裡就不給大家了,你們可以自己試著轉換看看。
下面的儲存過程查詢表的記錄數:
create proc prcrowscount
@tabname varchar(200), --需要查詢的表名
@colname varchar(200)='*', --需要查詢的列名
@condition varchar(200)='' --查詢條件
asbegin
declare @strsql varchar(255)
if @condition = ''
set @strsql='select count('+@colname+') from '+@tabname
else
set @strsql='select count('+@colname+') from '+@tabname+' where '+@condition
exec (@strsql)
end
go
還有刪除記錄的通用儲存過程和查詢單條記錄的通用儲存過程在這裡就不奉送了,感謝提供原通用分頁查詢儲存過程的哥們,謝謝。
通用分頁儲存過程 sqlserver
獲取指定頁的資料 create procedure sppagination tblname varchar 255 表名 strgetfields varchar 1000 需要返回的列 fldname varchar 255 排序的欄位名 pagesize int 10,頁尺寸 pageinde...
sqlserver 通用分頁儲存過程
示例一create procedure commonpagination columns varchar 500 要顯示的列名,用逗號隔開 tablename varchar 100 要查詢的表名 ordercolumnname varchar 100 排序的列名 order varchar 50 ...
通用分頁儲存過程 sqlserver
獲取指定頁的資料 create procedure sppagination tblname varchar 255 表名 strgetfields varchar 1000 需要返回的列 fldname varchar 255 排序的欄位名 pagesize int 10,頁尺寸 pageinde...