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

首頁 > 編程 > C# > 正文

C#拼接SQL語句 用ROW_NUMBER實現的高效分頁排序

2020-01-24 03:41:52
字體:
來源:轉載
供稿:網友
如果項目中要用到數據庫,鐵定要用到分頁排序。之前在做數據庫查詢優化的時候,通宵寫了以下代碼,來拼接分頁排序的SQL語句

復制代碼 代碼如下:

/// <summary>
/// 單表(視圖)獲取分頁SQL語句
/// </summary>
/// <param name="tableName">表名或視圖名</param>
/// <param name="key">唯一鍵</param>
/// <param name="fields">獲取的字段</param>
/// <param name="condition">查詢條件(不包含WHERE)</param>
/// <param name="collatingSequence">排序規則(不包含ORDER BY)</param>
/// <param name="pageSize">頁大小</param>
/// <param name="pageIndex">頁碼(從1開始)</param>
/// <returns>分頁SQL語句</returns>
public static string GetPagingSQL(
string tableName,
string key,
string fields,
string condition,
string collatingSequence,
int pageSize,
int pageIndex)
{
string whereClause = string.Empty;
if (!string.IsNullOrEmpty(condition))
{
whereClause = string.Format("WHERE {0}", condition);
}

if (string.IsNullOrEmpty(collatingSequence))
{
collatingSequence = string.Format("{0} ASC", key);
}

StringBuilder sbSql = new StringBuilder();

sbSql.AppendFormat("SELECT {0} ", PrependTableName(tableName, fields, ','));
sbSql.AppendFormat("FROM ( SELECT TOP {0} ", pageSize * pageIndex);
sbSql.AppendFormat(" [_RowNum_] = ROW_NUMBER() OVER ( ORDER BY {0} ), ", collatingSequence);
sbSql.AppendFormat(" {0} ", key);
sbSql.AppendFormat(" FROM {0} ", tableName);
sbSql.AppendFormat(" {0} ", whereClause);
sbSql.AppendFormat(" ) AS [_TempTable_] ");
sbSql.AppendFormat(" INNER JOIN {0} ON [_TempTable_].{1} = {0}.{1} ", tableName, key);
sbSql.AppendFormat("WHERE [_RowNum_] > {0} ", pageSize * (pageIndex - 1));
sbSql.AppendFormat("ORDER BY [_TempTable_].[_RowNum_] ASC ");

return sbSql.ToString();
}

/// <summary>
/// 給字段添加表名前綴
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="fields">字段</param>
/// <param name="separator">標識字段間的分隔符</param>
/// <returns></returns>
public static string PrependTableName(string tableName, string fields, char separator)
{
StringBuilder sbFields = new StringBuilder();

string[] fieldArr = fields.Trim(separator).Split(separator);
foreach (string str in fieldArr)
{
sbFields.AppendFormat("{0}.{1}{2}", tableName, str.Trim(), separator);
}

return sbFields.ToString().TrimEnd(separator);
}

假設有如下產品表:
復制代碼 代碼如下:

CREATE TABLE [dbo].[Tbl_Product]
(
[ID] [int] IDENTITY(1, 1)
NOT NULL ,
[ProductId] [varchar](50) NOT NULL ,
[ProductName] [nvarchar](50) NOT NULL ,
[IsDeleted] [int] NOT NULL
CONSTRAINT [DF_Tbl_Product_IsDeleted] DEFAULT ( (0) ) ,
CONSTRAINT [PK_Tbl_Product] PRIMARY KEY CLUSTERED ( [ProductId] ASC )
WITH ( PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON ) ON [PRIMARY]
)
ON [PRIMARY]

Tbl_Product->ID(序號,非空,自增)
Tbl_Product->ProductId(產品Id,主鍵)
Tbl_Product->ProductName(產品名稱,非空)
Tbl_Product->IsDeleted(虛擬刪除標記,非空)
調用BasicFunction.GetPagingSQL("Tbl_Product", "ID", "ID,ProductId,ProductName", "IsDeleted=0", "ProductName ASC, ID DESC", 5, 5),BasicFunction為分頁排序方法所在的靜態類,生成的分頁排序SQL語句如下(已手動調整了格式):
復制代碼 代碼如下:

SELECT Tbl_Product.ID ,
Tbl_Product.ProductId ,
Tbl_Product.ProductName
FROM ( SELECT TOP 25
[_RowNum_] = ROW_NUMBER() OVER ( ORDER BY ProductName ASC, ID DESC ) ,
ID
FROM Tbl_Product
WHERE IsDeleted = 0
) AS [_TempTable_]
INNER JOIN Tbl_Product ON [_TempTable_].ID = Tbl_Product.ID
WHERE [_RowNum_] > 20
ORDER BY [_TempTable_].[_RowNum_] ASC

查詢的字段列表,去掉了不關心的字段(這里為IsDeleted,因為條件里面IsDeleted=0,查出來的產品都是沒被刪除的);
排序依據,在調用該方法時,應盡量確保排序的依據可以唯一確定記錄在結果集中的位置(這里添加了輔助排序依據,ID DESC,如果產品重名,添加的晚的排在前面);
性能優化的一點兒建議:如果字段的值是計算出來的,如:總價=單價*數量,而此時需要總價大于多少的記錄,還得拿總價遞增或者遞減排序,如果不要臨時表,數據量大的時候,就等著買新電腦吧!你問我為什么要買新電腦,哦,因為你會把現在的電腦砸掉!O(∩_∩)O~
另外一點兒建議,使用ROW_NUMBER時,切記一定要和“TOP n”一起使用,n等于int.MaxValue都比不加“TOP n”時要快。
最后,拜托哪位好心人士給測試下性能,拜托了,本人數據庫菜鳥,不太懂得數據庫的性能測試。

我只知道我對我寫的分頁排序還是很有信心的,(*^__^*) 嘻嘻!

首發:博客園->劍過不留痕
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
一本大道亚洲视频| 久久琪琪电影院| 精品久久香蕉国产线看观看gif| 国产成人短视频| 国产91网红主播在线观看| 亚洲精品福利在线| 日韩乱码在线视频| 国外色69视频在线观看| 国产成人在线一区| 亚洲第一福利在线观看| 美女国内精品自产拍在线播放| 国产丝袜高跟一区| 69久久夜色精品国产7777| yw.139尤物在线精品视频| 欧美黑人xxxⅹ高潮交| 亚洲xxx自由成熟| 精品久久久久久久久久久久久| 丝袜情趣国产精品| 国产精品日韩欧美综合| 日本三级韩国三级久久| 欧美大肥婆大肥bbbbb| 亚洲欧洲在线观看| 国产一区二区激情| 欧美一级成年大片在线观看| 国产丝袜一区视频在线观看| 欧美大肥婆大肥bbbbb| 国产亚洲精品日韩| 2021久久精品国产99国产精品| 精品国产欧美成人夜夜嗨| 日韩在线视频一区| 在线电影欧美日韩一区二区私密| 国产精品你懂得| 欧美一乱一性一交一视频| 亚洲女人被黑人巨大进入al| 一本色道久久88精品综合| 91精品视频播放| 国产伦精品免费视频| 色综合久久天天综线观看| 日韩三级成人av网| 自拍偷拍亚洲在线| 91精品国产沙发| 亚洲精品国产suv| 久久久久久国产精品久久| 国产精品亚洲片夜色在线| 中文字幕精品在线视频| 欧美日韩亚洲一区二区| 91精品国产沙发| 久久伊人精品视频| 欧美性xxxxxxx| 欧美日本啪啪无遮挡网站| 91精品综合久久久久久五月天| 免费91在线视频| 久久久亚洲影院你懂的| 亚洲日韩欧美视频| 欧美日韩福利在线观看| 亚洲性日韩精品一区二区| 成人性生交大片免费看小说| 欧美大尺度在线观看| 久久影视电视剧免费网站清宫辞电视| 91国语精品自产拍在线观看性色| 91久久久国产精品| 欧美日韩视频免费播放| 欧美日韩成人精品| 欧美性xxxxx极品| 一区二区三欧美| 亚洲欧美综合另类中字| 久久久久久久久久久人体| 亚洲激情在线观看视频免费| 久久99久久久久久久噜噜| 亚洲精品成人久久| 国产在线98福利播放视频| 美女福利精品视频| 精品女厕一区二区三区| 色综合天天综合网国产成人网| 久久影院模特热| 亚洲在线视频观看| 尤物tv国产一区| 国产精品999999| 日韩欧美成人区| 久久久www成人免费精品| 久久精品夜夜夜夜夜久久| 91夜夜未满十八勿入爽爽影院| 少妇激情综合网| 精品久久久香蕉免费精品视频| 亚洲精品91美女久久久久久久| 中文字幕免费精品一区| 欧美日韩在线视频一区| 午夜精品久久久久久99热软件| 日韩高清电影免费观看完整| 日韩av快播网址| 深夜福利亚洲导航| 久久久久久18| 日韩在线中文视频| 中文字幕亚洲欧美日韩在线不卡| 精品高清一区二区三区| 亚洲人成毛片在线播放| 欧美性色xo影院| 日韩欧美国产成人| 国模私拍视频一区| 91欧美激情另类亚洲| 91免费的视频在线播放| 日韩精品免费在线观看| 国产精品三级网站| 欧美午夜精品久久久久久人妖| 国产精品久久综合av爱欲tv| 亚洲成色999久久网站| 亚洲国产97在线精品一区| 国产精品亚洲аv天堂网| 91在线观看免费观看| 国产精品一二三视频| 在线日韩日本国产亚洲| 欧美成人免费全部观看天天性色| 久久影院模特热| 欧洲日本亚洲国产区| 中文字幕精品视频| 国产精品18久久久久久首页狼| 欧美成人全部免费| 日韩欧美在线视频免费观看| 日韩av综合网站| www.xxxx欧美| 91在线播放国产| 911国产网站尤物在线观看| 91精品久久久久久久久久另类| 91超碰中文字幕久久精品| 亚洲高清久久网| 亚洲品质视频自拍网| 亚洲天堂免费视频| 国产精品精品视频一区二区三区| 亚洲色图第一页| 久久亚洲精品一区| 庆余年2免费日韩剧观看大牛| 精品少妇一区二区30p| 亚洲www永久成人夜色| 亚洲男人第一网站| 欧美日韩中文字幕| 欧美成人免费小视频| 欧美精品少妇videofree| 日韩欧美a级成人黄色| 91美女福利视频高清| 成人欧美一区二区三区黑人孕妇| 国产精品中文字幕在线观看| 精品国产区一区二区三区在线观看| 欧美激情一级欧美精品| 日韩欧美国产骚| 久久久久久网址| 丰满岳妇乱一区二区三区| 日韩在线欧美在线国产在线| 欧美一级片免费在线| 国产日韩欧美自拍| 国产精品久久久久91| 亚洲男人第一网站| 欧美日韩综合视频| 久久青草精品视频免费观看| 欧美理论电影在线观看| 欧美性猛交xxxx久久久| 国产成人激情小视频| www高清在线视频日韩欧美| 日韩的一区二区| yw.139尤物在线精品视频| 97免费视频在线播放| 欧美精品在线免费| 久久99青青精品免费观看| 精品久久久久久久久久久久| 日韩欧美福利视频|