SqlServer支援多表關聯的分頁儲存過程
具體程式碼如下所示:
CREATE PROCEDURE p_GetPager
@TotalCount INT OUTPUT, --總記錄數
@TotalPage INT OUTPUT, --總頁數
@Table NVARCHAR(1000), --表名稱,可多表連線,如:TbA a LEFT JOIN TbB b ON a.User=b.User
@Column NVARCHAR(1000), --查詢列,可多列,如:*或者a.ID,b.UserName
@OrderColumn NVARCHAR(100), --排序欄位,如:SortNo ASC或a.SortNo ASC,b.CrtTime DESC
@GroupColumn NVARCHAR(150), --分組欄位,如:UserName或a.UserName,b.Time
@PageIndex INT, --當前頁數
@PageSize INT, --每頁記錄數
@Group TINYINT, --是否啟用分組
@Condition NVARCHAR(4000) --查詢條件,如:SortNo>100或a.SortNo>100 AND b.UserName='張三'
AS
DECLARE @PageCount INT, --總頁數
@strSql NVARCHAR(4000), --主查詢語句
@strTemp NVARCHAR(2000), --臨時變數
@strCount NVARCHAR(1000), --統計語句
@strOrderType NVARCHAR(1000); --排序語句
BEGIN
SET @PageCount = @PageSize * (@PageIndex - 1);
SET @strOrderType = N' ORDER BY ' + @OrderColumn + N' ';
IF @Condition != ''
BEGIN
IF @PageIndex = 1
BEGIN
IF @Group = 1
BEGIN
SET @strCount
= N'SELECT @TotalCount=COUNT(*) FROM ' + @Table + N' WHERE ' + @Condition + N' GROUP BY '
+ @GroupColumn;
SET @strCount = @strCount + N' SET @ [email protected]@ROWCOUNT';
SET @strSql
= N'SELECT TOP ' + STR(@PageSize) + N' ' + @Column + N' FROM ' + @Table + N' WHERE ' + @Condition
+ N' GROUP BY ' + @GroupColumn + N' ' + @strOrderType;
END;
ELSE
BEGIN
SET @strCount = N'SELECT @TotalCount=COUNT(*) FROM ' + @Table + N' WHERE ' + @Condition;
SET @strSql
= N'SELECT TOP ' + STR(@PageSize) + N' ' + @Column + N' FROM ' + @Table + N' WHERE ' + @Condition
+ N' ' + @strOrderType;
END;
END;
ELSE
BEGIN
IF @Group = 1
BEGIN
SET @strCount
= N'SELECT @TotalCount=COUNT(*) FROM ' + @Table + N' WHERE ' + @Condition + N' GROUP BY '
+ @GroupColumn;
SET @strCount = @strCount + N' SET @ [email protected]@ROWCOUNT';
SET @strSql
= N'SELECT * FROM (SELECT TOP (2000) ' + @Column + N',ROW_NUMBER() OVER(' + @strOrderType
+ N') AS NUM FROM ' + @Table + N' WHERE ' + @Condition + N' GROUP BY ' + @GroupColumn
+ N') AS T WHERE NUM BETWEEN ' + STR(@PageCount + 1) + N' AND ' + STR(@PageCount + @PageSize);
END;
ELSE
BEGIN
SET @strCount = N'SELECT @TotalCount=COUNT(*) FROM ' + @Table + N' WHERE ' + @Condition;
SET @strSql
= N'SELECT * FROM (SELECT TOP (2000) ' + @Column + N',ROW_NUMBER() OVER(' + @strOrderType
+ N') AS NUM FROM ' + @Table + N' WHERE ' + @Condition + N') AS T WHERE NUM BETWEEN '
+ STR(@PageCount + 1) + N' AND ' + STR(@PageCount + @PageSize);
END;
END;
END;
ELSE
--沒有查詢條件
BEGIN
IF @PageIndex = 1
BEGIN
IF @Group = 1
BEGIN
SET @strCount = N'SELECT @TotalCount=COUNT(*) FROM ' + @Table + N' GROUP BY ' + @GroupColumn;
SET @strCount = @strCount + N'SET @ [email protected]@ROWCOUNT';
SET @strSql
= N'SELECT TOP ' + STR(@PageSize) + N' ' + @Column + N' FROM ' + @Table + N' GROUP BY '
+ @GroupColumn + N' ' + @strOrderType;
END;
ELSE
BEGIN
SET @strCount = N'SELECT @TotalCount=COUNT(*) FROM ' + @Table;
SET @strSql
= N'SELECT TOP ' + STR(@PageSize) + N' ' + @Column + N' FROM ' + @Table + N' ' + @strOrderType;
END;
END;
ELSE
BEGIN
IF @Group = 1
BEGIN
SET @strCount = N'SELECT @TotalCount=COUNT(*) FROM ' + @Table + N' GROUP BY ' + @GroupColumn;
SET @strCount = @strCount + N'SET @[email protected]@ROWCOUNT';
SET @strSql
= N'SELECT * FROM (SELECT TOP (2000) ' + @Column + N',ROW_NUMBER() OVER(' + @strOrderType
+ N') AS NUM FROM ' + @Table + N' GROUP BY ' + @GroupColumn + N') AS T WHERE NUM BETWEEN '
+ STR(@PageCount + 1) + N' AND ' + STR(@PageCount + @PageSize);
END;
ELSE
BEGIN
SET @strCount = N'SELECT @TotalCount=COUNT(*) FROM ' + @Table;
SET @strSql
= N'SELECT * FROM (SELECT TOP (2000) ' + @Column + N',ROW_NUMBER() OVER(' + @strOrderType
+ N') AS NUM FROM ' + @Table + N') AS T WHERE NUM BETWEEN ' + STR(@PageCount + 1) + N' AND '
+ STR(@PageCount + @PageSize);
END;
END;
END;
EXEC sp_executesql @strCount,
N'@TotalCount INT OUTPUT',
@TotalCount OUTPUT;
IF @TotalCount > 2000
BEGIN
SET @TotalCount = 2000;
END;
IF @TotalCount % @PageSize = 0
BEGIN
SET @TotalPage = @TotalCount / @PageSize;
END;
ELSE
BEGIN
SET @TotalPage = @TotalCount / @PageSize + 1;
END;
SET NOCOUNT ON;
EXEC (@strSql);
END;
相關推薦
SqlServer支援多表關聯的分頁儲存過程
具體程式碼如下所示: CREATE PROCEDURE p_GetPager @TotalCount INT OUTPUT, --總記錄數 @TotalPage INT OUTPUT, --總頁數 @Table NVARCHAR(1
Spring Data JPA 二:實現多表關聯分頁查詢
最近在對JPA的使用過程中發現對於單表的操作很是方便,但是當設計到多表聯查的時候就需要有一些特殊的操作了。 專案中有一個場景是後臺需要做一個分頁的列表查詢,所需要的資料分散在兩張表中,如果是用mybatis的話直接定義resultMap,然後手寫SQL就可以了。而在JPA中就需要用到JPQL
多表查詢千萬數量級分頁儲存過程,可支援多表查詢,任意排序
Create PROCEDURE usp_PagingLarge @TableNames VARCHAR(200), --表名,可以是多個表,但不能用別名 @PrimaryKey VARCHAR(100), --主鍵,可以為空,但@Order為空時該值不能為
MYSQL多表分頁儲存過程
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_AllSiteSearch`(IN pagesize int,IN pageindex int,IN skey varchar(100),IN dt varchar(10),IN
PageHelpher、MyBatis關聯查詢,多表查詢分頁問題
一般MyBatis作為ORM框架,需要做分頁一般會選擇使用PageHelper。PageHelper非常強大的分頁外掛,和mybatis整合也非常方便。PageHelper對單表分頁或者整體結果集分頁是比較方便的。 不過有時我們會遇到這樣的問題。利用MyBatis做多表
Spring Data Jpa多表聯合分頁查詢
參考:https://blog.csdn.net/qq_36144258/article/details/80298354 近期一個專案用到Spring Data Jpa,Jpa用來做單表查詢非常的簡單粗暴,可以說不用寫sql,但是涉及到複雜的多表操作,還是要寫sql,這個時候需要用到@Quer
(六)springboot + mybatis plus實現多表聯查分頁3.X版本
註明 : 上兩篇文章我們講解了springboot+mybatis-plus對於單表的CRUD和條件構造器的使用方法,但是對於我們的實戰專案中多表聯查也是經常會出現的。今天我們就來說下怎麼在springboot+MP模式下實現多表聯查並分頁。 MP推薦使用的是
分頁-儲存過程5種寫法 sqlserver分頁
在SQL Server資料庫操作中,我們常常會用到儲存過程對實現對查詢的資料的分頁處理,以方便瀏覽者的瀏覽。本文我們總結了五種SQL Server分頁儲存過程的方法,並對其效能進行了比較,接下來就讓我們來一起了解一下這一過程。 建立資料庫data_Test : create
sqlServer分頁儲存過程的呼叫
現象: sqlServer的分頁一直相對比較複雜。這裡使用儲存過程實現分頁邏輯 解決辦法 1:action獲取查詢的條件,初始化每頁顯示的大小,page代表當前檢視第幾頁,預設設定為第一頁。rows表示每頁顯示的大小。sort代表查詢按什麼欄位排序 如果要
hibernate兩表關聯分頁查詢
核心實現程式碼: @Override public Map<String ,Object> getBackUserNurseBeanList( String name, Integer pageNo) { if(pageNo == n
.net通用CMS快速開發框架——問題:Dapper通用的多表聯合分頁查詢怎麼破?
最近在弄一個東東,類似那種CMS的後臺管理系統,方便作為其它專案的初始化框架用的。 現在遇到個問題,如標題所示:Dapper通用的多表聯合分頁查詢怎麼破? 單表的話很簡單就可以實現,多表不通用的話也可以很方便的實現,那麼如果多表通用的話,怎麼辦呢? 難道只能通過拼接sql或者使用儲存過程嗎?我先來展示下
SSM框架 Mybatis聯合查詢 多表查詢 分頁
這篇文章主要介紹了Java的MyBatis框架中實現多表連線查詢和查詢結果分頁,藉助MyBatis框架中帶有的動態SQL查詢功能可以比普通SQL查詢做到更多,需要的朋友可以參考下 Java的MyBatis框架中實現多表連線查詢和查詢結果分頁 實現多表聯合查詢
Sqlserver,MySql 通用分頁儲存過程
MySql 分頁儲存過程 CREATE PROCEDURE ProcPage( in tableName varchar(20),#表名 in showField varchar(100),#要顯示的列名 in whereText varchar(500),#where條件(只需要寫where後面的語句)
多表連線分頁問題
專案中有個業務需要多張表的一個連線,還需要根據{size}和{offset}進行分頁,這個時候,問題來了,表連線如果是一對一關係,正常在sql最後分頁,什麼事都沒有,可是,一旦有多對多關係和一對多關係
Hibernate Criteria查詢之多表連線分頁-1
最近嘗試用Hibernate的Criteria查詢實現多表連線下的分頁,發現一些Hibernate的奇怪問題:多表連線後的分頁求總條數始終報錯,檢查生成的sql也不正確。研究許久找到問題所在,特貼如下: Mysql指令碼如下: 學生 測試資料,請勿見笑:) /* Navic
簡單Java 多表聯查分頁顯示(初)
Java 多表聯查分頁顯示 操作步驟: 建立資料庫 使用Servlet 建立Java專案 編寫程式碼 1、資料庫 選用 Oracle 程式碼附上: drop table Score; drop table S
springboot + mybatis plus實現多表聯查分頁
auto score ice get pro err type 實現 app 1 配置分頁插件 public class MybatisPlusConfig { @Bean public PaginationInterceptor paginationInt
mysql分頁儲存過程一步一步實現
1. CREATE DEFINER=`root`@`localhost` PROCEDURE `P_HoverTreePages`( IN `TableName` VARCHAR(200), IN `FieldList` VARCHAR(2000) , IN `Pr
Vs呼叫分頁儲存過程
/// <summary> /// 顯示+分頁+模糊查詢 /// </summary> &n
MSSQL資料庫分頁儲存過程
create procedure [dbo].[p_splitpage] @sql nvarchar(4000), @currentpage int=2, @pagesize int=10, @recordcount int=0 output, @pagecount int=0 out