亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > .NET > 正文

asp.net 分頁存儲過程實例剖析心得

2024-07-10 13:24:39
字體:
來源:轉載
供稿:網友
1.開始還原 下面先看一下原來的分頁存儲過程。

復制代碼 代碼如下:


ALTER PROCEDURE [dbo].[sp_Sql_Paging]
(
@SqlDataTable NVARCHAR(4000), -- 表名
@PrimaryKey NVARCHAR(4000), -- 主鍵名稱
@Fields NVARCHAR(4000), -- 要返回的字段
@pageSize INT, -- 頁尺寸
@pageIndex INT, -- 頁碼
@recordCount INT OUTPUT, -- 記錄總數
@strOrderBy NVARCHAR(4000), -- 排序
@strWhere NVARCHAR(4000) -- 查詢條件
)
AS
BEGIN
SET NOCOUNT ON
DECLARE @strSQL1 NVARCHAR(4000) -- SQL語句1
DECLARE @strSQL2 NVARCHAR(4000) -- SQL語句2

-- 創建臨時表
-- 用來保存表的編號以及主鍵
CREATE TABLE #Temp_Paging
(
Temp_Paging_Id INT,
RowNumber INT
)
SET @strSQL1 = 'INSERT INTO [#Temp_Paging](Temp_Paging_Id, RowNumber) SELECT ' + @PrimaryKey + ', ROW_NUMBER() OVER (' + @strOrderBy + ') AS RowNumber FROM ' + @SqlDataTable + ' ' + @strWhere
EXEC SP_EXECUTESQL @strSQL1
SET @recordCount = @@ROWCOUNT -- 取得總記錄數

-- 判斷頁索引
IF @pageIndex > @recordCount * 1.0 / @pageSize + 1.0 OR @recordCount <= @pageSize
BEGIN
SET @pageIndex = 1
END

-- 分頁查詢
SET @strSQL2 = 'SELECT ' + @Fields + ' FROM ' + @SqlDataTable + ' WHERE ' + @PrimaryKey + ' IN (SELECT Temp_Paging_Id FROM [#Temp_Paging] WHERE RowNumber BETWEEN ' + Str((@pageIndex - 1) * @pageSize + 1) + ' AND ' + Str(@pageIndex * @pageSize) + ') ' + @strOrderBy
EXEC SP_EXECUTESQL @strSQL2
DROP TABLE #Temp_Paging -- 刪除臨時表
END


從原分頁存儲過程很容易看出,這里運用了臨時表保存編號,然后在通過pageIndex和pageSize計算所得,進行分頁。

因為這里還以主鍵作為查詢條件,故臨時表中也保存了主鍵值。

很顯然,這里的臨時表無法做到通用,因為主鍵的類型不一定是上面定義的INT型,也可以是其它的類型,比如:uniqueidentifier(全球唯一標識)。

這樣的話,這個存儲過程就碰到了問題,所以必須進行改進。

2.思路一
思路一很簡單,那就把這個類型聲明成一個變量,然后通過系統表獲取表的主鍵類型,再賦給變量不就可以了嗎。看起來很美妙,不妨試一試先。

我們可以插入下面一段代碼:

復制代碼 代碼如下:


DECLARE @colType NVARCHAR(50) --主鍵列類型
DECLARE @strSQL3 NVARCHAR(500) --創建臨時表語句

SET @colType = (SELECT typ.name as 數據類型
FROM sys.columns col
left join sys.types typ
on (col.system_type_id = typ.system_type_id AND col.user_type_id = typ.user_type_id)
WHERE col.object_id = (SELECT object_id FROM sys.tables WHERE name = @SqlDataTable)
and exists
( SELECT 1 FROM sys.indexes idx
join sys.index_columns idxCol
on (idx.object_id = idxCol.object_id)
WHERE idx.object_id = col.object_id
AND idxCol.index_column_id = col.column_id
AND idx.is_primary_key = 1
))

SET @strSQL3 = 'CREATE TABLE #Temp_Paging
(
Temp_Paging_Id '+ @colType+',
RowNumber INT
)'
PRINT @strSQL3
--EXEC(@strSQL3)


打印結果:

復制代碼 代碼如下:


CREATE TABLE #Temp_Paging
(
Temp_Paging_Id uniqueidentifier,
RowNumber INT
)


很顯然我們得到了所需要的臨時表。這時我很開心,因為得到了我想要的東西。但似乎還沒有結束,我要執行下該存儲過程。

壞結果往往在這時出現:

asp.net 分頁存儲過程實例剖析心得


這里就出現奇怪的事了,按打印出來的明明是正確的創建臨時表語句,而且也執行了,為什么接下來對臨時表的操作又是無效的了?

找資料問同事,終于明白,原來臨時表分本地臨時表和全局臨時表。本地臨時表需要注意實際刪除的時間。

這里說得簡單一點:當在用EXEC(@strSQL3) 創建臨時表的時候,同時已經刪除了臨時表。因為EXEC這個過程的會話已經結束,臨時表就被刪除了。

這里有一篇博文做了更具體的解釋,大家可以參考:點滴在心頭_SQL臨時表

3.思路二

上面的思路似乎行不通,那不如再換個思路,干脆不要建立臨時表,用Select * from (select * from table) as temptable 這種思路代替創建臨時表。

代碼如下:

復制代碼 代碼如下:


ALTER PROCEDURE [dbo].[sp_Sql_Paging]
(
@SqlDataTable NVARCHAR(4000), -- 表名
@PrimaryKey NVARCHAR(4000), -- 主鍵名稱
@Fields NVARCHAR(4000), -- 要返回的字段
@pageSize INT, -- 頁尺寸
@pageIndex INT, -- 頁碼
@recordCount INT OUTPUT, -- 記錄總數
@strOrderBy NVARCHAR(4000), -- 排序
@strWhere NVARCHAR(4000) -- 查詢條件
)
AS
BEGIN
SET NOCOUNT ON
DECLARE @strSQL1 NVARCHAR(4000) -- SQL語句1
DECLARE @strSQL2 NVARCHAR(4000) -- SQL語句2
DECLARE @strSQL3 NVARCHAR(4000) -- SQL語句3

SET @strSQL1 = 'SELECT ' + @PrimaryKey + ', ROW_NUMBER() OVER (' + @strOrderBy + ') AS RowNumber FROM ' + @SqlDataTable + ' ' + @strWhere

--獲取總記錄數
SET @strSQL3 = 'SELECT @recordCount = COUNT(*) FROM ' + @SqlDataTable + ' ' + @strWhere
EXEC SP_EXECUTESQL
@stmt = @strSQL3,
@params = N'@recordCount AS INT OUTPUT',
@recordCount = @recordCount OUTPUT

--分頁查詢
IF @pageIndex > @recordCount * 1.0 / @pageSize + 1.0 OR @recordCount <= @pageSize
BEGIN
SET @pageIndex = 1
END
SET @strSQL2 = 'SELECT ' + @Fields + ' FROM ' + @SqlDataTable + ' WHERE ' + @PrimaryKey + ' IN (SELECT '+@PrimaryKey+' FROM ('+@strSQL1+') TempTable WHERE RowNumber BETWEEN ' + Str((@pageIndex - 1) * @pageSize + 1) + ' AND ' + Str(@pageIndex * @pageSize) + ') ' + @strOrderBy
EXEC SP_EXECUTESQL @strSQL2
END


這里有個小知識點,注意EXEC SP_EXECUTESQL的寫法以及和EXEC(@strsql)的區別。大家可以去找資料了解下。

關于分頁的一些事就寫到這了,僅供參考。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美中文字幕在线观看| 美女少妇精品视频| 久久九九热免费视频| 中文字幕综合一区| 欧美乱大交xxxxx另类电影| 国产一区二区三区毛片| 欧美大片免费观看在线观看网站推荐| 久久久久久999| 亚洲肉体裸体xxxx137| 亚洲一区二区三区香蕉| 精品伊人久久97| 亚洲精品97久久| 91日本视频在线| 久久国产一区二区三区| 一区二区欧美日韩视频| 日韩不卡中文字幕| 538国产精品视频一区二区| 日韩国产精品视频| 亚洲xxxx视频| 国产精品jvid在线观看蜜臀| 夜夜嗨av一区二区三区四区| 亚洲激情视频网| 亚洲人成亚洲人成在线观看| 久久综合亚洲社区| 成人国产精品日本在线| 欧美黑人极品猛少妇色xxxxx| 亚洲欧美日韩国产成人| 中文字幕久久精品| 日韩少妇与小伙激情| 91国产视频在线| 久久久久久久久亚洲| 欧美国产在线视频| 国产精品一区二区av影院萌芽| 97超碰蝌蚪网人人做人人爽| 日本一区二三区好的精华液| 日韩欧美成人网| 性色av一区二区三区红粉影视| 日韩美女av在线免费观看| 成人欧美一区二区三区黑人孕妇| 在线观看欧美日韩国产| 日韩大胆人体377p| 国模gogo一区二区大胆私拍| 国产精品香蕉国产| 狠狠躁夜夜躁人人躁婷婷91| 国产成人av在线播放| 日韩电影中文字幕在线观看| 欧美午夜丰满在线18影院| 日韩成人在线网站| 久久成人在线视频| 第一福利永久视频精品| 91久久久久久久久| 日韩中文字幕视频在线观看| 少妇精69xxtheporn| www.久久草.com| 不卡中文字幕av| 日韩精品在线免费观看视频| 久久久久久18| 欧美极品少妇xxxxⅹ裸体艺术| 欧美亚洲国产视频小说| 97在线免费观看| 成人黄色在线观看| 国模视频一区二区三区| 国内精品在线一区| 欧美激情极品视频| 国产精品久久91| 成人福利视频网| 国产91精品在线播放| 欧美精品videosex性欧美| 日韩成人av在线播放| 日韩中文字幕亚洲| 一本大道香蕉久在线播放29| 秋霞av国产精品一区| 久久九九热免费视频| 国产欧美日韩最新| 成人中心免费视频| 亚洲精品中文字幕有码专区| 国产成人精品在线观看| 久久天天躁狠狠躁夜夜爽蜜月| 欧美福利视频在线观看| 久久中文字幕视频| 国产精品成久久久久三级| 亚洲v日韩v综合v精品v| 日韩高清欧美高清| 国产精品久久久久影院日本| 欧美精品videos另类日本| 国产精品久久不能| 亚洲日韩第一页| 欧美高清视频免费观看| 亚洲人成伊人成综合网久久久| 久久久999精品视频| 亚洲午夜色婷婷在线| 国产欧美久久一区二区| 久久久精品视频在线观看| 国产精品专区第二| 国产欧美精品一区二区三区-老狼| 欧美人与物videos| 日韩精品免费在线| 欧美亚洲免费电影| 欧美中文在线观看| www.欧美免费| 亚洲精品99久久久久| 超碰日本道色综合久久综合| 俺去亚洲欧洲欧美日韩| 国产精品白嫩初高中害羞小美女| 亚洲天堂2020| 国产亚洲视频中文字幕视频| 亚洲精品在线91| 97久久伊人激情网| 91手机视频在线观看| 亚洲视频在线视频| 欧美在线免费视频| 欧美性受xxx| 欧美激情成人在线视频| 亚洲成人国产精品| 97视频在线观看播放| 91精品国产91| 国产成人啪精品视频免费网| 日韩av电影中文字幕| 日韩精品久久久久久久玫瑰园| 97av在线视频免费播放| 亚洲成色999久久网站| 国产一区二区三区毛片| 在线播放国产一区二区三区| 欧美另类精品xxxx孕妇| 91精品久久久久| 亚洲国产美女精品久久久久∴| 精品国偷自产在线| 主播福利视频一区| 久久久久久久久久久成人| 亚洲变态欧美另类捆绑| 亚洲欧美另类在线观看| 国产日韩欧美在线| 国产精品激情自拍| 91精品美女在线| 欧美极品在线播放| 91九色单男在线观看| 播播国产欧美激情| 97精品久久久中文字幕免费| 国产精品自产拍高潮在线观看| 国产成人久久久| 在线视频精品一| 在线观看久久av| 国产成人精品一区| 色偷偷偷亚洲综合网另类| 欧美大片在线免费观看| 一区二区三区日韩在线| 91极品视频在线| 欧美极品第一页| 91极品女神在线| 91综合免费在线| 亚洲国产精品系列| 一区二区三区无码高清视频| 成人福利免费观看| 国产成人精品视频在线| 日韩电影中文字幕在线观看| 国产精品中文字幕在线| 亚洲成人精品视频| 国产亚洲精品一区二区| 在线成人中文字幕| 亚洲精品一区在线观看香蕉| 亚洲高清免费观看高清完整版| 国产日产欧美精品| 另类视频在线观看| 日韩av在线高清|