1. 程式人生 > >多表查詢千萬數量級分頁儲存過程,可支援多表查詢,任意排序

多表查詢千萬數量級分頁儲存過程,可支援多表查詢,任意排序

Create PROCEDURE usp_PagingLarge
@TableNames VARCHAR(200),     --表名,可以是多個表,但不能用別名
@PrimaryKey VARCHAR(100),     --主鍵,可以為空,但@Order為空時該值不能為空
@Fields     VARCHAR(4000),         --要取出的欄位,可以是多個表的欄位,可以為空,為空表示select *
@PageSize INT,             --每頁記錄數
@CurrentPage INT,         --當前頁,0表示第1頁
@Filter VARCHAR(4000) = '',     --條件,可以為空,不用填 where
@Group VARCHAR(200) = '',     --分組依據,可以為空,不用填 group by
@Order VARCHAR(200) = '',    --排序,可以為空,為空預設按主鍵升序排列,不用填 order by
@RecordCount int OUTPUT             --總記錄數,自己增加(總記錄數)
AS
BEGIN
     DECLARE @SortColumn VARCHAR(200)
     DECLARE @Operator CHAR(2)
     DECLARE @SortTable VARCHAR(200)
     DECLARE @SortName VARCHAR(200)
     IF @Fields = ''
         SET @Fields = '*'
     IF @Filter = ''
         SET @Filter = 'Where 1=1'
     ELSE
         SET @Filter = 'Where ' +   @Filter
     IF @Group <>''
         SET @Group = 'GROUP BY ' + @Group

     IF @Order <> ''
     BEGIN
         DECLARE @pos1 INT, @pos2 INT
         SET @Order = REPLACE(REPLACE(@Order, ' asc', ' ASC'), ' desc', ' DESC')
         IF CHARINDEX(' DESC', @Order) > 0
             IF CHARINDEX(' ASC', @Order) > 0
             BEGIN
                 IF CHARINDEX(' DESC', @Order) < CHARINDEX(' ASC', @Order)
                     SET @Operator = '<='
                 ELSE
                     SET @Operator = '>='
             END
             ELSE
                 SET @Operator = '<='
         ELSE
             SET @Operator = '>='
         SET @SortColumn = REPLACE(REPLACE(REPLACE(@Order, ' ASC', ''), ' DESC', ''), ' ', '')
         SET @pos1 = CHARINDEX(',', @SortColumn)
         IF @pos1 > 0
             SET @SortColumn = SUBSTRING(@SortColumn, 1, @pos1-1)
         SET @pos2 = CHARINDEX('.', @SortColumn)
         IF @pos2 > 0
         BEGIN
             SET @SortTable = SUBSTRING(@SortColumn, 1, @pos2-1)
             IF @pos1 > 0 
                 SET @SortName = SUBSTRING(@SortColumn, @pos2+1, @
[email protected]
)              ELSE                  SET @SortName = SUBSTRING(@SortColumn, @pos2+1, LEN(@SortColumn)[email protected])          END          ELSE          BEGIN              SET @SortTable = @TableNames              SET @SortName = @SortColumn          END      END      ELSE      BEGIN          SET @SortColumn = @PrimaryKey          SET @SortTable = @TableNames          SET @SortName = @SortColumn          SET @Order = @SortColumn          SET @Operator = '>='      END      DECLARE @type varchar(50)      DECLARE @prec int      Select @type=t.name, @prec=c.prec      FROM sysobjects o       JOIN syscolumns c on o.id=c.id      JOIN systypes t on c.xusertype=t.xusertype      Where o.name = @SortTable AND c.name = @SortName      IF CHARINDEX('char', @type) > 0      SET @type = @type + '(' + CAST(@prec AS varchar) + ')'      DECLARE @TopRows INT      SET @TopRows = @PageSize * @CurrentPage + 1      print @TopRows      print @Operator      EXEC('          DECLARE @SortColumnBegin ' + @type + '          SET ROWCOUNT ' + @TopRows + '          Select @SortColumnBegin=' + @SortColumn + ' FROM   ' + @TableNames + ' ' + @Filter + ' ' + @Group + ' orDER BY ' + @Order + '          SET ROWCOUNT ' + @PageSize + '          Select ' + @Fields + ' FROM   ' + @TableNames + ' ' + @Filter   + ' AND ' + @SortColumn + '' + @Operator + '@SortColumnBegin ' + @Group + ' orDER BY ' + @Order + '          ')        IF @RecordCount IS NULL BEGIN     DECLARE @sql nvarchar(4000)     SET @sql=N'SELECT @RecordCount=COUNT(*)'         +N' FROM '
[email protected]
        +N' '[email protected]     EXEC sp_executesql @sql,N'@RecordCount int OUTPUT',@RecordCount OUTPUT END
END GO

--呼叫例子:

--1.單表/單排序
EXECusp_PagingLarge'bigtable','d_id','d_id,d_title,d_content,d_time',20,1,'','','d_iddesc'
--2.單表/多排序
EXECusp_PagingLarge'bigtable','d_id','*',20,0,'','','d_timeasc,d_iddesc'

--3.多表/單排序
EXEC usp_PagingLarge'bigtable left join bigtable_author on bigtable.d_id=bigtable_author.BigTable_id','bigtable.d_id','bigtable.d_id,bigtable.d_title,bigtable.d_content,bigtable.d_time,bigtable_author.d_author',20,0,'','','bigtable.d_idasc'

--4.多表/多排序
EXEC usp_PagingLarge'bigtableleftjoinbigtable_authoronbigtable.d_id=bigtable_author.BigTable_id','bigtable.d_id','bigtable.d_id,bigtable.d_title,bigtable.d_content,bigtable.d_time,bigtable_author.d_author',20,0,'','','bigtable.d_timeasc,bigtable.d_iddesc' 

 public DataTable ExecMultiPageList(string tableName,string iDName,string Fields,int pageSize,int currentPage,string Filter,string Group,string Order,out int rowCount)
    { 
    int rowCount=0;
//    @TableNames VARCHAR(200),--表名,可以是多個表,但不能用別名
//@PrimaryKey VARCHAR(100),--主鍵,可以為空,但@Order為空時該值不能為空
//@Fields VARCHAR(200),--要取出的欄位,可以是多個表的欄位,可以為空,為空表示select*
//@PageSize INT,--每頁記錄數
//@CurrentPage INT,--當前頁,0表示第1頁
//@Filter VARCHAR(200)='',--條件,可以為空,不用填where
//@Group VARCHAR(200)='',--分組依據,可以為空,不用填groupby
//@Order VARCHAR(200)=''--排序,可以為空,為空預設按主鍵升序排列,不用填orderby
        SqlParameter[] parameters = { 
                                    new SqlParameter("@TableName",SqlDbType.VarChar,200),
                                    new SqlParameter("@PrimaryKey",SqlDbType.VarChar,100),
                                    new SqlParameter("@Fields",SqlDbType.VarChar,200),
                                    new SqlParameter("@PageSize",SqlDbType.Int,4),
                                    new SqlParameter("@CurrentPage",SqlDbType.Int,4),
                                    new SqlParameter("@Filter",SqlDbType.VarChar,200),
                                    new SqlParameter("@Group",SqlDbType.VarChar,200),
                                    new SqlParameter("@Order",SqlDbType.VarChar,200),
                                     new SqlParameter("@RecordCount",SqlDbType.Int,4)
    };//引數列表
        parameters[0].Value = tableName;
        parameters[1].Value = iDName;
        parameters[2].Value = Fields;
        parameters[3].Value = pageSize;
        parameters[4].Value = currentPage;
        parameters[5].Value = Filter;
        parameters[6].Value = Group;
        parameters[7].Value = Order;//引數對應值
        parameters[8].Value = rowCount;
        parameters[8].Direction = ParameterDirection.Output;
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = Connection;
        cmd.CommandText = "usp_PagingLarge";//儲存過程名
        cmd.CommandType = CommandType.StoredProcedure;//型別
        cmd.Parameters.AddRange(parameters);
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        DataTable dt = new DataTable();
        da.Fill(dt);
        CloseDB();
        rowCount = Convert.ToInt32(parameters[8].Value);//輸出
        return dt;
    }


相關推薦

查詢千萬數量級儲存過程,支援查詢,任意排序

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

SqlServer支援關聯的儲存過程

具體程式碼如下所示: CREATE PROCEDURE p_GetPager @TotalCount INT OUTPUT, --總記錄數 @TotalPage INT OUTPUT, --總頁數 @Table NVARCHAR(1

通用的查詢條件的SQL語句的儲存過程(2)

程式碼二: CREATE PROCEDURE pagination @tblName varchar(255), – 表名 @strGetFields varchar(1000) = ‘*’, – 需要返回的列 @fldName varch

sql2000,千萬級大資料量儲存過程效率測試附程式碼

在專案中,我們經常遇到或用到分頁,那麼在大資料量(百萬級以上)下,哪種分頁演算法效率最優呢?我們不妨用事實說話。 測試環境 硬體:CPU 酷睿雙核T5750  記憶體:2G 軟體:Windows server 2003    +   Sql server 2005 OK

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

儲存過程

-- ============================================= -- Author: <Author,,Name> -- Create date: <Create Date,,> -- Description: &l

【資料庫效能測試實戰】測試不同儲存過程在10w,100w以及1000w資料量下面的表現

前言 資料庫的效能與每一行程式碼息息相關,所以,每次寫程式碼可以考慮一下在不同級別的資料量下面測試一下效能。 本文參考了: Postgresql生成大量測試資料 以及 準備測試用資料 此次測試我們將分別用10w,100w以及1000w級別的表來測試,下面先建立

增刪改查儲存過程

--建立資料庫 CREATE DATABASE PROCDB GO --使用資料庫 GO USE PROCDB GO --建立表供儲存過程的實現 CREATE TABLE STUDENTINFOS ( ID INT PRIMARY KEY IDENTITY, S_NAME NVARCHA

C# DataGridView功能(SQL儲存過程實現)

{            dtStaff.Clear();            SqlConnection conn = new SqlConnection(Param_Class.Param_DB.strConn);            SqlDataAdapter Sda = new SqlDataA

-儲存過程5種寫法 sqlserver

在SQL Server資料庫操作中,我們常常會用到儲存過程對實現對查詢的資料的分頁處理,以方便瀏覽者的瀏覽。本文我們總結了五種SQL Server分頁儲存過程的方法,並對其效能進行了比較,接下來就讓我們來一起了解一下這一過程。 建立資料庫data_Test : create

sqlServer儲存過程的呼叫

現象: sqlServer的分頁一直相對比較複雜。這裡使用儲存過程實現分頁邏輯 解決辦法 1:action獲取查詢的條件,初始化每頁顯示的大小,page代表當前檢視第幾頁,預設設定為第一頁。rows表示每頁顯示的大小。sort代表查詢按什麼欄位排序 如果要

C#呼叫SQL Server儲存過程

以SQL Server2012提供的offset ..rows fetch next ..rows only為例e.g.表名:Tab1 ---------------------------------- ID Name 1 tblAttributeGroupDetail 2

MySql 儲存過程

DELIMITER $$ #修改分隔符為 $$ DROP PROCEDURE IF EXISTS sp_MvcCommonDataSource$$ #分隔符 CREATE PROCEDURE sp_MvcCommonDataSource ( #輸入引數 _fields

MySQL使用limit的通用儲存過程

輸出的結果:通用分頁儲存過程的程式碼:@a   代表要查詢的列名@b  代表要查詢的表名@c   代表從多少個開始@d   代表每次顯示多少條資料DELIMITER $$ USE `t204`$$ DROP PROCEDURE IF EXISTS `pro_01`$$

EntityFramework呼叫儲存過程

感謝博主https://www.cnblogs.com/qk2014/p/6824103.html 此文講述mvc4+entityframework6+sqlserver2008環境下呼叫儲存過程,實現分頁。 1、分頁儲存過程程式碼如下: 分頁原理用的row_nu

大資料量儲存過程效率測試

我首先寫了五個常用儲存過程: 1,利用select top 和select not in進行分頁,具體程式碼如下: CREATE PROCEDURE Proc_paged_with_notin --利用select top and select n

Sqlserver,MySql 通用儲存過程

MySql 分頁儲存過程 CREATE PROCEDURE ProcPage( in tableName varchar(20),#表名 in showField varchar(100),#要顯示的列名 in whereText varchar(500),#where條件(只需要寫where後面的語句)