Maison base de données tutoriel mysql 2分法-通用存储过程分页(top max模式)版本_MySQL

2分法-通用存储过程分页(top max模式)版本_MySQL

Jun 01, 2016 pm 02:05 PM
set 存储 模式 版本 processus 通用

--/*-----存储过程 分页处理 孙伟 2005-03-28创建 -------*/
--/*----- 对数据进行了2分处理使查询前半部分数据与查询后半部分数据性能相同 -------*/
--/*-----存储过程 分页处理 孙伟 2005-04-21修改 添加Distinct查询功能-------*/
--/*-----存储过程 分页处理 孙伟 2005-05-18修改 多字段排序规则问题-------*/
--/*-----存储过程 分页处理 孙伟 2005-06-15修改 多字段排序修改-------*/
--/*-----存储过程 分页处理 孙伟 2005-12-13修改 修改数据分页方式为top max模式 性能有极大提高-------*/
--/*-----缺点:相对之前的not in版本主键只能是整型字段,如主键为GUID类型请使用not in 模式的版本-------*/
CREATE PROCEDURE dbo.proc_ListPageInt
(
@tblName nvarchar(200), ----要显示的表或多个表的连接
@fldName nvarchar(500) = '*', ----要显示的字段列表
@pageSize int = 10, ----每页显示的记录个数
@page int = 1, ----要显示那一页的记录
@pageCount int = 1 output, ----查询结果分页后的总页数
@Counts int = 1 output, ----查询到的记录数
@fldSort nvarchar(200) = null, ----排序字段列表或条件
@Sort bit = 0, ----排序方法,0为升序,1为降序(如果是多字段排列Sort指代最后一个排序字段的排列顺序(最后一个排序字段不加排序标记)--程序传参如:' SortA Asc,SortB Desc,SortC ')
@strCondition nvarchar(1000) = null, ----查询条件,不需where
@ID nvarchar(150), ----主表的主键
@Dist bit = 0 ----是否添加查询字段的 DISTINCT 默认0不添加/1添加
)
AS
SET NOCOUNT ON
Declare @sqlTmp nvarchar(1000) ----存放动态生成的SQL语句
Declare @strTmp nvarchar(1000) ----存放取得查询结果总数的查询语句
Declare @strID nvarchar(1000) ----存放取得查询开头或结尾ID的查询语句

Declare @strSortType nvarchar(10) ----数据排序规则A
Declare @strFSortType nvarchar(10) ----数据排序规则B

Declare @SqlSelect nvarchar(50) ----对含有DISTINCT的查询进行SQL构造
Declare @SqlCounts nvarchar(50) ----对含有DISTINCT的总数查询进行SQL构造


if @Dist = 0
begin
set @SqlSelect = 'select '
set @SqlCounts = 'Count(*)'
end
else
begin
set @SqlSelect = 'select distinct '
set @SqlCounts = 'Count(DISTINCT ' @ID ')'
end


if @Sort=0
begin
set @strFSortType=' ASC '
set @strSortType=' DESC '
end
else
begin
set @strFSortType=' DESC '
set @strSortType=' ASC '
end

--------生成查询语句--------
--此处@strTmp为取得查询结果数量的语句
if @strCondition is null or @strCondition='' --没有设置显示条件
begin
set @sqlTmp = @fldName ' From ' @tblName
set @strTmp = @SqlSelect ' @Counts=' @SqlCounts ' FROM ' @tblName
set @strID = ' From ' @tblName
end
else
begin
set @sqlTmp = @fldName 'From ' @tblName ' where (1>0) ' @strCondition
set @strTmp = @SqlSelect ' @Counts=' @SqlCounts ' FROM ' @tblName ' where (1>0) ' @strCondition
set @strID = ' From ' @tblName ' where (1>0) ' @strCondition
end

----取得查询结果总数量-----
exec sp_executesql @strTmp,N'@Counts int out ',@Counts out
declare @tmpCounts int
if @Counts = 0
set @tmpCounts = 1
else
set @tmpCounts = @Counts

--取得分页总数
set @pageCount=(@tmpCounts @pageSize-1)/@pageSize

/**//**当前页大于总页数 取最后一页**/
if @page>@pageCount
set @page=@pageCount

--/*-----数据分页2分处理-------*/
declare @pageIndex int --总数/页大小
declare @lastcount int --总数%页大小

set @pageIndex = @tmpCounts/@pageSize
set @lastcount = @tmpCounts%@pageSize
if @lastcount > 0
set @pageIndex = @pageIndex 1
else
set @lastcount = @pagesize

--//***显示分页
if @strCondition is null or @strCondition='' --没有设置显示条件
begin
if @pageIndex begin
if @page=1
set @strTmp=@SqlSelect ' top ' CAST(@pageSize as VARCHAR(4)) ' ' @fldName ' from ' @tblName
' order by ' @fldSort ' ' @strFSortType
else
begin
set @strTmp=@SqlSelect ' top ' CAST(@pageSize as VARCHAR(4)) ' ' @fldName ' from ' @tblName
' where ' @ID ' ' order by ' @fldSort ' ' @strFSortType ') AS TBMinID)'
' order by ' @fldSort ' ' @strFSortType
end
end
else
begin
set @page = @pageIndex-@page 1 --后半部分数据处理
if @page set @strTmp=@SqlSelect ' * from (' @SqlSelect ' top ' CAST(@lastcount as VARCHAR(4)) ' ' @fldName ' from ' @tblName
' order by ' @fldSort ' ' @strSortType ') AS TempTB' ' order by ' @fldSort ' ' @strFSortType
else
set @strTmp=@SqlSelect ' * from (' @SqlSelect ' top ' CAST(@pageSize as VARCHAR(4)) ' ' @fldName ' from ' @tblName
' where ' @ID ' >(select max(' @ID ') from(' @SqlSelect ' top ' CAST(@pageSize*(@page-2) @lastcount as Varchar(20)) ' ' @ID ' from ' @tblName
' order by ' @fldSort ' ' @strSortType ') AS TBMaxID)'
' order by ' @fldSort ' ' @strSortType ') AS TempTB' ' order by ' @fldSort ' ' @strFSortType
end
end

else --有查询条件
begin
if @pageIndex begin
if @page=1
set @strTmp=@SqlSelect ' top ' CAST(@pageSize as VARCHAR(4)) ' ' @fldName ' from ' @tblName
' where 1=1 ' @strCondition ' order by ' @fldSort ' ' @strFSortType
else
begin
set @strTmp=@SqlSelect ' top ' CAST(@pageSize as VARCHAR(4)) ' ' @fldName ' from ' @tblName
' where ' @ID ' ' where (1=1) ' @strCondition ' order by ' @fldSort ' ' @strFSortType ') AS TBMinID)'
' ' @strCondition ' order by ' @fldSort ' ' @strFSortType
end
end
else
begin
set @page = @pageIndex-@page 1 --后半部分数据处理
if @page set @strTmp=@SqlSelect ' * from (' @SqlSelect ' top ' CAST(@lastcount as VARCHAR(4)) ' ' @fldName ' from ' @tblName
' where (1=1) ' @strCondition ' order by ' @fldSort ' ' @strSortType ') AS TempTB' ' order by ' @fldSort ' ' @strFSortType
else
set @strTmp=@SqlSelect ' * from (' @SqlSelect ' top ' CAST(@pageSize as VARCHAR(4)) ' ' @fldName ' from ' @tblName
' where ' @ID ' >(select max(' @ID ') from(' @SqlSelect ' top ' CAST(@pageSize*(@page-2) @lastcount as Varchar(20)) ' ' @ID ' from ' @tblName
' where (1=1) ' @strCondition ' order by ' @fldSort ' ' @strSortType ') AS TBMaxID)'
' ' @strCondition ' order by ' @fldSort ' ' @strSortType ') AS TempTB' ' order by ' @fldSort ' ' @strFSortType
end
end

------返回查询结果-----
exec sp_executesql @strTmp
--print @strTmp
SET NOCOUNT OFF
GO
调用方法列子:
/**////


/// 通用分页数据读取函数
/// 注意:在函数调用外部打开和关闭连接,以及关闭数据读取器
///

/// SqlCommand对象
/// 查询的表/表联合
/// 要查询的字段名
/// 每页数据大小
/// 当前第几页
/// 排序字段
/// 排序顺序0降序1升序
/// 过滤条件
/// 主表主键
/// 返回的SqlDataReader ref
public static void CutPageData(SqlConnection conn, ref SqlCommand comm, string _tblName, string _fldName, int _pageSize, int _page, string _fldSort, int _Sort, string _strCondition, string _ID, ref SqlDataReader _dr)
{
//注意:在函数调用外部打开和关闭连接,以及关闭数据读取器
//comm = new SqlCommand("proc_ListPage",conn);
//comm.CommandType = CommandType.StoredProcedure;
comm.Parameters.Add("@tblName", SqlDbType.NVarChar, 200);
comm.Parameters["@tblName"].Value = _tblName;
comm.Parameters.Add("@fldName", SqlDbType.NVarChar, 500);
comm.Parameters["@fldName"].Value = _fldName;
comm.Parameters.Add("@pageSize", SqlDbType.Int);
comm.Parameters["@pageSize"].Value = _pageSize;
comm.Parameters.Add("@page", SqlDbType.Int);
comm.Parameters["@page"].Value = _page;
comm.Parameters.Add("@fldSort", SqlDbType.NVarChar, 200);
comm.Parameters["@fldSort"].Value = _fldSort;
comm.Parameters.Add("@Sort", SqlDbType.Bit);
comm.Parameters["@Sort"].Value = _Sort;
comm.Parameters.Add("@strCondition", SqlDbType.NVarChar, 1000);
comm.Parameters["@strCondition"].Value = _strCondition;
comm.Parameters.Add("@ID", SqlDbType.NVarChar, 150);
comm.Parameters["@ID"].Value = _ID;
comm.Parameters.Add("@Counts", SqlDbType.Int, 0);
comm.Parameters["@Counts"].Direction = ParameterDirection.Output;
comm.Parameters.Add("@pageCount", SqlDbType.Int, 0);
comm.Parameters["@pageCount"].Direction = ParameterDirection.Output;

_dr = comm.ExecuteReader();
}
调用例如:
CutPageData(conn, ref comm, "VOX_CDSinger", "id, cdsinger, cdsingertype, area, cdsingerreadme", 15, page, "id", 1, strFilter, "id", ref dr);
对应说明:
CutPageData(数据连接对象, ref Sqlcommand对象, "需要表或视图名称", "要查询的字段", 每页读取数据条数, 当前页, "排序字段可多字段如(addtime desc, visitcounts注意这里最后一个字段不加desc或asc 最后一个字段对应于后面的排序规则)", 排序方式(1 desc 0 asc), where条件(这里不再添加where条件添加如:' and visitcounts>100'), 表主键, ref 返回的SqlDataReader对象);

这里的调用同样适用于之前的not in版本.


呵呵 这里献给大家 圣诞快乐 !

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

À quoi sert le mode Ne pas déranger de WeChat ? À quoi sert le mode Ne pas déranger de WeChat ? Feb 23, 2024 pm 10:48 PM

Que signifie le mode Ne pas déranger de WeChat ? De nos jours, avec la popularité des smartphones et le développement rapide de l'Internet mobile, les plateformes de médias sociaux sont devenues un élément indispensable de la vie quotidienne des gens. WeChat est l’une des plateformes de médias sociaux les plus populaires en Chine, et presque tout le monde possède un compte WeChat. Nous pouvons communiquer avec nos amis, notre famille et nos collègues en temps réel via WeChat, partager des moments de notre vie et comprendre la situation actuelle de chacun. Cependant, à notre époque, nous sommes également inévitablement confrontés aux problèmes de surcharge d'informations et de fuite de la vie privée, en particulier pour ceux qui ont besoin de se concentrer ou de se concentrer.

Tutoriel sur la mise à jour de la version curl sous Linux ! Tutoriel sur la mise à jour de la version curl sous Linux ! Mar 07, 2024 am 08:30 AM

Pour mettre à jour la version curl sous Linux, vous pouvez suivre les étapes ci-dessous : Vérifiez la version actuelle de curl : Tout d'abord, vous devez déterminer la version de curl installée dans le système actuel. Ouvrez un terminal et exécutez la commande suivante : curl --version Cette commande affichera les informations sur la version actuelle de curl. Confirmer la version curl disponible : Avant de mettre à jour curl, vous devez confirmer la dernière version disponible. Vous pouvez visiter le site officiel de curl (curl.haxx.se) ou des sources de logiciels associées pour trouver la dernière version de curl. Téléchargez le code source de curl : à l'aide de curl ou d'un navigateur, téléchargez le fichier de code source pour la version curl de votre choix (généralement .tar.gz ou .tar.bz2).

Étapes simples pour mettre à jour la version pip : effectuée en 1 minute Étapes simples pour mettre à jour la version pip : effectuée en 1 minute Jan 27, 2024 am 09:45 AM

Fait en une minute : Comment mettre à jour la version pip, des exemples de code spécifiques sont nécessaires Avec le développement rapide de Python, pip est devenu un outil standard pour la gestion des packages Python. Cependant, au fil du temps, les versions de pip sont constamment mises à jour. Afin de pouvoir utiliser les dernières fonctionnalités et corriger d'éventuelles failles de sécurité, il est très important de mettre à jour la version de pip. Cet article explique comment mettre à jour rapidement pip en une minute et fournit des exemples de code spécifiques. Tout d’abord, nous devons ouvrir une fenêtre de ligne de commande. Dans les systèmes Windows, vous pouvez utiliser

Vérifiez la version du système d'exploitation Kirin et la version du noyau Vérifiez la version du système d'exploitation Kirin et la version du noyau Feb 21, 2024 pm 07:04 PM

Vérification de la version du système d'exploitation Kylin et de la version du noyau Dans le système d'exploitation Kirin, savoir comment vérifier la version du système et la version du noyau est la base de la gestion et de la maintenance du système. Méthode 1 pour vérifier la version du système d'exploitation Kylin : Utilisez le fichier /etc/.kyinfo Pour vérifier la version du système d'exploitation Kylin, vous pouvez vérifier le fichier /etc/.kyinfo. Ce fichier contient des informations sur la version du système d'exploitation. Exécutez la commande suivante : cat/etc/.kyinfo Cette commande affichera des informations détaillées sur la version du système d'exploitation. Méthode 2 : utiliser le fichier /etc/issue Une autre façon de vérifier la version du système d'exploitation consiste à consulter le fichier /etc/issue. Ce fichier fournit également des informations sur la version, mais peut ne pas être aussi bon que le fichier .kyinfo.

Explication détaillée de la fonction Définir la balise dans les balises SQL dynamiques MyBatis Explication détaillée de la fonction Définir la balise dans les balises SQL dynamiques MyBatis Feb 26, 2024 pm 07:48 PM

Interprétation des balises SQL dynamiques MyBatis : explication détaillée de l'utilisation des balises Set MyBatis est un excellent cadre de couche de persistance. Il fournit une multitude de balises SQL dynamiques et peut construire de manière flexible des instructions d'opération de base de données. Parmi elles, la balise Set est utilisée pour générer la clause SET dans l'instruction UPDATE, qui est très couramment utilisée dans les opérations de mise à jour. Cet article expliquera en détail l'utilisation de la balise Set dans MyBatis et démontrera ses fonctionnalités à travers des exemples de code spécifiques. Qu'est-ce que Set tag Set tag est utilisé dans MyBati

Huawei lancera l'année prochaine des produits de stockage MED innovants : la capacité du rack dépasse 10 Po et la consommation électrique est inférieure à 2 kW Huawei lancera l'année prochaine des produits de stockage MED innovants : la capacité du rack dépasse 10 Po et la consommation électrique est inférieure à 2 kW Mar 07, 2024 pm 10:43 PM

Ce site Web a rapporté le 7 mars que le Dr Zhou Yuefeng, président de la gamme de produits de stockage de données de Huawei, a récemment assisté à la conférence MWC2024 et a spécifiquement présenté la solution de stockage magnétoélectrique OceanStorArctic de nouvelle génération conçue pour les données chaudes (WarmData) et les données froides (ColdData). Zhou Yuefeng, président de la gamme de produits de stockage de données de Huawei, a publié une série de solutions innovantes Source de l'image : Le communiqué de presse officiel de Huawei joint à ce site est le suivant : Le coût de cette solution est 20 % inférieur à celui de la bande magnétique, et son coût est de 20 % inférieur à celui de la bande magnétique. la consommation électrique est 90 % inférieure à celle des disques durs. Selon les médias technologiques étrangers blockandfiles, un porte-parole de Huawei a également révélé des informations sur la solution de stockage magnétoélectrique : le disque magnétoélectronique (MED) de Huawei est une innovation majeure dans le domaine des supports de stockage magnétiques. ME de première génération

Comment vérifier facilement la version installée d'Oracle Comment vérifier facilement la version installée d'Oracle Mar 07, 2024 am 11:27 AM

Comment vérifier facilement la version installée d'Oracle nécessite des exemples de code spécifiques. En tant que logiciel largement utilisé dans les systèmes de gestion de bases de données au niveau de l'entreprise, la base de données Oracle possède de nombreuses versions et différentes méthodes d'installation. Dans notre travail quotidien, nous devons souvent vérifier la version installée de la base de données Oracle pour les opérations et la maintenance correspondantes. Cet article explique comment vérifier facilement la version installée d'Oracle et donne des exemples de code spécifiques. Méthode 1 : Grâce à une requête SQL dans la base de données Oracle, nous pouvons

Interpréter le sens et la différence de la version PHP NTS Interpréter le sens et la différence de la version PHP NTS Mar 27, 2024 am 11:48 AM

La signification et la différence de la version PHP NTS PHP est un langage de script côté serveur populaire largement utilisé dans le domaine du développement Web. Il existe deux versions principales de PHP : ThreadSafe(TS) et Non-ThreadSafe(NTS). Sur le site officiel de PHP, nous pouvons voir deux versions téléchargeables de PHP différentes, à savoir PHPNTS et PHPTS. Alors, que signifie PHP version NTS ? Quelle est la différence avec la version TS ? Suivant,

See all articles