1. 程式人生 > >SqlServer支援多表關聯的分頁儲存過程

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