多表查詢千萬數量級分頁儲存過程,可支援多表查詢,任意排序
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後面的語句)