日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sqlserver2000分页存储过程(原创)

發布時間:2025/4/16 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sqlserver2000分页存储过程(原创) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

剛剛用了博客園,感覺這里的氣氛真的很好,發布這幾天寫的一個分頁存儲過程,請dudu多多關照,請各位大牛指正.
功能:海量優化,支持任何字段排序,可支持隨機取數據,導出所有數據功能,用了id(整型)比較方法
問題:
1.這里面運用到了臨時表變量和臨時表,在使用這個的時候也沒感覺用臨時表變量快,不知道是什么原因,請各位大蝦分析一下.
2.尾頁數據優化,折半式的方式,不過只用了一次折半,多次的話好像行不通,不知道是不是其它好方法,
3.數據量小的時候采用臨時表,當超過@RSCOUNT所指定數時采用臨時表
4.這里面臨時表和臨時表變量的使用是在不是主鍵排序時采用的,因為非主鍵排序時通常是可能存在重復
5.如果表中用guid的話好像很麻煩,在想是不是不用id比較的方法采用in的方法,目前guid這個還沒考慮進去
6.可由用戶定制是否返回記錄總數(當非主鍵排序時一定需要這個返回值的)
7.考慮到注入這問題的話,我想一般是在程序里面的自動去掉一些特殊的字符的,這里面就沒考慮這個是不是可以注入的,請大家看一看是不是可以注入的

以下是代碼:

------------------------------------------------------------------------------------------------------------------------
-- Function: 返回記錄集
-- Date Created: 2007年7月14日
-- Created By:?? sjf?shijf1984@gmail.com http://netcorner.cnblogs.com/
--last update:2007.11.16
--declare @intReturn int
--exec USP_Pagination 'test','*','id',10,99998,0,'id','',0,1,@intReturn output
------------------------------------------------------------------------------------------------------------------------
-- 獲取指定頁的數據
CREATE PROCEDURE USP_Pagination
@tblName varchar(255), -- 表名
@strGetFields varchar(500) = '*', -- 需要返回的列
@fldName varchar(255)='', -- 排序的字段名
@PageSize int = 10, -- 頁顯示記錄數
@PageIndex int = 1, -- 頁碼
@OrderType bit = 0, -- 設置排序類型, 非 0 值則降序
@tblPk varchar(100)='id',--表的主鍵字段(可省略)
@strWhere varchar(1000) = '',-- 查詢條件 (注意: 不要加 where)
@intRand int=0,--是否需要隨機顯示數據,只適合第一頁的情況,0表示不需要
@intReturnState int=1,--是否需要返回值,1為需要
@Result int output? --返回頁數值
AS
set nocount on
if(@PageIndex<1) return
declare @strSQL nvarchar(4000) -- 主語句
declare @strCount varchar(4000) --統計
declare @strTmp varchar(100) -- 臨時變量
declare @strTmp1 varchar(100) --臨時
declare @strOrder varchar(200) -- 排序類型
declare @strOrder1 varchar(200) --排序折半處理
declare @RSCOUNT int --多少條記錄時用臨時表變量
set @RSCOUNT=100000 --臨時表可能需要開銷 4*4*100000 byte
declare @RSFOOTER int --記錄尾部超過時處理開關
set @RSFOOTER=1000
set @strCount=""
declare @strWhere1 varchar(1000) --條件多個連接情況使用
set @strWhere1=""
if @strWhere != ''
begin
?set @strWhere1=" and ("+@strWhere+")"
?set @strWhere=" where "+@strWhere+" "
end
if @intReturnState=1
?set @strCount="select @intTotal=count(*) from? " +@tblName+@strWhere+"; "
if @OrderType != 0 --排序類型
begin
?set @strTmp = "<(select min"
?set @strTmp1 = "<=(select max"
?set @strOrder = " order by " + @fldName +" desc"
?set @strOrder1 = " order by " + @fldName +" asc"
? --如果@OrderType不是0,就執行降序,這句很重要!
end
else
begin
?set @strTmp = ">(select max"
?set @strTmp1 = ">=(select min"
?set @strOrder = " order by " + @fldName +" asc"
?set @strOrder1 = " order by " + @fldName +" desc"
end
if @PageIndex = 1? --第一頁的處理,如果是第一頁就執行以上代碼,這樣會加快執行速度
begin
?declare @top nvarchar(100)
?if(@PageSize<1)
??set @top=" "
?else
??set @top=" top " + str(@PageSize) +" "
?if(@intRand=0) --是否需要隨便產生
??set @strSQL = "select " + @top +@strGetFields+ " from " + @tblName + @strWhere + " " + @strOrder
?else
?begin
??set @strSQL="select " + @top + @strGetFields+ " from " + @tblName + @strWhere + " order by newid()"
?end
?set @strSQL=@strCount+@strSQL
end
else --其它頁的處理
begin
?if @fldName!=@tblPk --非主鍵排序創建臨時表或臨時表變量
?begin
??declare @strTmptbl char(10);
??set @strTmptbl="temptable"
??if(@PageSize*@PageIndex>@RSCOUNT) --記錄數大于@RSCOUNT時采用臨時表處理否則就用表變量
??begin
???set @strTmptbl="#temptable"
???set @strSQL="select top "+str(@PageSize*@PageIndex)+" newid = cast("+@tblPk+" AS int),tempid = IDENTITY (int, 1, 1) INTO "+@strTmptbl+" FROM "+ @tblName + @strWhere + @strOrder +";"
??end
??else
??begin
???set @strTmptbl="@tmpTable"
???set @strSQL="DECLARE "+@strTmptbl+" TABLE([newid] [int] NOT NULL,[tempid] [int] IDENTITY (1, 1) NOT NULL); "+
???"INSERT into "+@strTmptbl+"([newid]) select? top "+str(@PageSize*@PageIndex)+" "+@tblPk+" FROM "+ @tblName + @strWhere + @strOrder +";"
??end
??set @strSQL=@strCount
??+@strSQL+"select top "+str(@PageSize)+" "+@strGetFields+" from "+@tblName+" where [" +@tblPk+"]? in(SELECT? [newid] FROM "+@strTmptbl+" WHERE (tempid >"+str(@PageSize*(@PageIndex-1))+")) "
?end
?else
?begin
??if(@strCount!="")
???set @strCount=@strCount
???+"declare @t int; "
???+" set @t="+str(@PageSize*(@PageIndex-1))+";"
???+" if(@t>@intTotal/2 and @intTotal>"+str(@RSFOOTER)+")"
???+" begin "
???+"set @t=@intTotal-@t; "
???+"if(@t<1) "
???+"begin "
???+"set @intTotal=0; "
???+"return; "
???+"end "
???+" exec('select top " + str(@PageSize)+" "+@strGetFields+"? from "+@tblName+" where ["+@fldName+"] "+@strTmp1+"(["+@fldName+"]) from (select top '+@t+' "+@fldName+" from "+@tblName+" "+replace(@strWhere,"'","''")+@strOrder1+") as t1)"+replace(@strWhere1,"'","''")+" "+@strOrder+"');"
???+" end "
???+" else "
??set @strSQL =@strCount
??+"select top " + str(@PageSize) +" "+@strGetFields+ " from ["
??+ @tblName + "] where [" + @fldName + "]" + @strTmp + "(["
??+ @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["
??+ @fldName + "] from [" + @tblName + "]? " + @strWhere + " "
??+ @strOrder + ") as tblTmp)? "+@strWhere1+@strOrder
?end
end
print @strSQL
if @intReturnState=1
?exec? sp_executesql @strSQL,N'@intTotal int output',@Result output
else
?exec (@strSQL)
GO

總結

以上是生活随笔為你收集整理的sqlserver2000分页存储过程(原创)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。