Heim Datenbank MySQL-Tutorial MSSQL分页存储过程

MSSQL分页存储过程

Jun 07, 2016 pm 02:57 PM
mssql 分页 存储 过程

Version1.0.52014.07.15更新 本存储过程是本人查找对比网络上常用的分页存储过程后改写的分页存储过程,拥有较高效率,但不保证效率最高。 本存储过程是在MSSQL2012上编写,不保证兼容所有版本MSSQL(已知MSSQL2005需要修改少量代码)。不兼容其他数据库。 本

Version 1.0.5 2014.07.15更新
本存储过程是本人查找对比网络上常用的分页存储过程后改写的分页存储过程,拥有较高效率,但不保证效率最高。
本存储过程是在MSSQL2012上编写,不保证兼容所有版本MSSQL(已知MSSQL2005需要修改少量代码)。不兼容其他数据库。
本分页存储过程仅支持常用SQL语句。
若发现问题,请联系ttio4116@live.com或到我的个人博客http://blog.ttionya.com留言,共同进步!!

一些注意事项见文件内的README
?SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/*
README
Version 1.0.5
本存储过程是本人查找对比网络上常用的分页存储过程后改写的分页存储过程,拥有较高效率,但不保证效率最高。
本存储过程是在MSSQL2012上编写,不保证兼容所有版本MSSQL(已知MSSQL2005需要修改少量代码)。不兼容其他数据库。
本分页存储过程仅支持常用SQL语句。
若发现问题,请联系ttio4116@live.com,共同进步!!

版本更新:
Version 1.0.1:修复了查询第一页数据时会采用错误的SQL语句的BUG
Version 1.0.2:更新了部分参数的解释
Version 1.0.3:修复了多表查询时由于表名错误导致的出错
Version 1.0.4:去除了部分不需要的条件判断语句
Version 1.0.5:修复了第一页时GROUP BY的错误,现在可以在@FldName里面加入COUNT()、MAX()等(不限于此)聚合函数

注意:1.HAVING语句需要与GROUP BY语句配合使用,格式为:GROUP BY XXX HAVING XXX。
      2.@FldSort需要给需要排序的字段设置ASC或者DESC。
      3.@strOrder为排序&聚合参数,排序时在没有设置@FldSort时起作用(默认正序排列);聚合时为了计算总条数,若该参数为空时则取@FldSort的第一个字段。
	  4.建议@strOrder设置为主键,就算不是主键也不要包含NULL,否则会发生不可预料的结果。若该参数为空,请务必使@FldSort的第一个字段不含NULL。
*/
CREATE PROCEDURE [dbo].[MyPageRead]
(
@TblName nvarchar(3000)     --连接的表名,即FROM后面的内容
,@FldName nvarchar(3000)='*'     --要查询的字段名称,默认为全部
,@FldSort nvarchar(3000)=NULL     --排序字段,不需要ORDER BY,排序自行设置,请加入ASC或者DESC
,@strCondition nvarchar(3000)=NULL     --要查询的语句,不需要WHERE,前面不需要跟AND或者OR,但是不会影响计算
,@strGroup nvarchar(3000)=NULL     --要聚合的语句,不需要GROUP BY
,@strHaving nvarchar(3000)=NULL     --HAVING语句,不需要HAVING
,@Dist bit=0     --是否去除重复数据,0不去除/1去除
,@strOrder nvarchar(1000)=NULL     --一个排序字段,当@FldSort为空时必须指定。而且该字段用于计算总条数,该字段为空时选取@FldSort的第一个字段
,@OnlyCounts bit=0     --是否只返回总条数而不进行分页

,@PageSize int=10     --每页要显示的数量
,@Page int=1     --要显示那一页的数据

,@Counts int=1 output     --返回总条数
,@PageCounts int=1 output     --返回总页数
)
AS
SET NOCOUNT ON     --不返回计数
--定义变量
DECLARE @tmpFldSort nvarchar(3000)     --构成的ORDER BY语句存放处
DECLARE @tmpstrCondition nvarchar(3000)     --WHERE语句存放处
DECLARE @tmpstrGroup nvarchar(3000)     --GROUP BY语句存放处
DECLARE @tmpstrfirst nvarchar(3000)     --1.开头存放处,控制Dist
DECLARE @tmpstrfirstCount nvarchar(3000)     --2.开头存放处,控制Dist

/*计算时间*/
DECLARE @StartTime datetime
SET @StartTime=GETDATE()


IF (@FldSort IS NULL OR @FldSort='') AND (@strOrder IS NULL OR @strOrder='')
	RETURN
--必须有一个有值,如果有问题,直接跳出

IF @FldSort IS NULL OR @FldSort=''
	SET @tmpFldSort=@strOrder+' ASC '
ELSE
	SET @tmpFldSort=@FldSort
--以上为设置ORDER BY语句

IF @strCondition IS NULL OR @strCondition=''
	SET @tmpstrCondition=''
ELSE
	BEGIN
		IF CHARINDEX('AND ',LTRIM(@strCondition))=1
			SET @strCondition=RIGHT(@strCondition,LEN(@strCondition)-4)
		IF CHARINDEX('OR ',LTRIM(@strCondition))=1
			SET @strCondition=RIGHT(@strCondition,LEN(@strCondition)-3)
		SET @tmpstrCondition=' WHERE '+@strCondition
	END
--以上为设置WHERE语句

IF @strGroup IS NULL OR @strGroup=''
	SET @tmpstrGroup=''
ELSE
	BEGIN
		SET @tmpstrGroup=' GROUP BY '+@strGroup
		IF @strHaving IS NOT NULL AND @strHaving<>''
			SET @tmpstrGroup=@tmpstrGroup+' HAVING '+@strHaving
	END
--以上为设置GROUP BY语句

DECLARE @tmpFldsubstr nvarchar(1000)     --排序的第一个字段,用于计算总数据量,当@strOrder无数据时有效
IF @Dist=0
	BEGIN
		SET @tmpstrfirst=' SELECT '
		IF @strOrder IS NULL OR @strOrder=''
			BEGIN
				SET @tmpFldsubstr=LEFT(LTRIM(@FldSort),CHARINDEX(CHAR(32),LTRIM(@FldSort)))
				SET @tmpstrfirstCount=' SELECT @Counts=COUNT('+@tmpFldsubstr+')'
			END
		ELSE
			SET @tmpstrfirstCount=' SELECT @Counts=COUNT('+@strOrder+')'
	END
ELSE
	BEGIN
		SET @tmpstrfirst=' SELECT DISTINCT '
		IF @strOrder IS NULL OR @strOrder=''
			BEGIN
				SET @tmpFldsubstr=LEFT(LTRIM(@FldSort),CHARINDEX(CHAR(32),LTRIM(@FldSort)))
				SET @tmpstrfirstCount=' SELECT @Counts=COUNT(DISTINCT '+@tmpFldsubstr+')'
			END
		ELSE
			SET @tmpstrfirstCount=' SELECT @Counts=COUNT(DISTINCT '+@strOrder+')'
	END
--以上通过@Dist设置@Counts

DECLARE @sqlStr nvarchar(3000)     --查询的sql语句
IF @tmpstrGroup=''
	SET @sqlStr=@tmpstrfirstCount+' FROM '+@TblName+@tmpstrCondition
ELSE
	BEGIN
		SET @tmpstrfirstCount=REPLACE(@tmpstrfirstCount,'@Counts=','')
		SET @sqlStr='SELECT @Counts=COUNT(*) FROM ('+@tmpstrfirstCount+'AS tmpF FROM '+@TblName+@tmpstrCondition+@tmpstrGroup+') AS tmpT'
	END
EXEC sp_executesql @sqlStr,N'@Counts int out ',@Counts out     --返回查找到的总数

IF @OnlyCounts=1
	RETURN
--如果@OnlyCounts=1,则直接返回总条数

DECLARE @tmpCounts int 
IF @Counts=0
    SET @tmpCounts=1 
ELSE
    SET @tmpCounts=@Counts

SET @PageCounts=(@tmpCounts+@PageSize-1)/@PageSize
--以上获得分页总数

IF @Page<1
	SET @Page=1
IF @Page>@PageCounts
	SET @Page=@PageCounts
--以上设置分页

DECLARE @tmpsql nvarchar(3000)     --设置最后要查询的SQL语句

IF @Page=1     --当取第一页时,用最快的算法
	SET @tmpsql=@tmpstrfirst+' TOP '+CAST(@PageSize AS nvarchar(50))+' '+@FldName+' FROM '+@TblName+@tmpstrCondition+@tmpstrGroup+' ORDER BY '+@tmpFldSort
IF @Page>1 AND @Page<=@PageCounts/2     --这是要查询的页在总分页数的前半
	BEGIN
		SET @tmpsql='WITH temptbl AS(SELECT TOP '+CAST(@Page*@PageSize AS nvarchar(50))+' ROW_NUMBER() OVER(ORDER BY '+@tmpFldSort+') AS tmpRowIndex,'+@FldName+' FROM '+@TblName+' '+@tmpstrCondition+' '+@tmpstrGroup+') '
		SET @tmpsql=@tmpsql+'SELECT * FROM temptbl WHERE [tmpRowIndex] BETWEEN '+CAST((@Page-1)*@PageSize+1 AS nvarchar(50))+' AND '+CAST((@Page-1)*@PageSize+@PageSize AS nvarchar(50))
	END
IF @Page>1 AND @Page>@PageCounts/2     --从后面查在总分页数的后半数据
	BEGIN
		SET @tmpFldSort=REPLACE(@tmpFldSort,' ASC',' [~1]')
		SET @tmpFldSort=REPLACE(@tmpFldSort,' DESC',' [~2]')
		SET @tmpFldSort=REPLACE(@tmpFldSort,'[~1]','DESC')
		SET @tmpFldSort=REPLACE(@tmpFldSort,'[~2]','ASC')
		--优化后半部分数据查询,把查询条件互换,[~1]为DESC,[~2]为ASC
		SET @tmpsql='WITH temptbl AS(SELECT TOP '+CAST(@Counts-(@Page-1)*@PageSize AS nvarchar(50))+' ROW_NUMBER() OVER(ORDER BY '+@tmpFldSort+') AS tmpRowIndex,'+@FldName+' FROM '+@TblName+' '+@tmpstrCondition+' '+@tmpstrGroup+') '
		SET @tmpsql=@tmpsql+'SELECT * FROM temptbl WHERE [tmpRowIndex] BETWEEN '+CAST(@Counts-((@Page-1)*@PageSize+@PageSize-1) AS nvarchar(50))+' AND '+CAST(@Counts-((@Page-1)*@PageSize) AS nvarchar(50))+' ORDER BY tmpRowIndex DESC'
	END

--SELECT @tmpsql     查看拼接的字符串
EXEC sp_executesql @tmpsql

/*计算时间*/
--SELECT DATEDIFF(MS,@StartTime,GETDATE()) AS [Time]
/**/
SET NOCOUNT OFF
Nach dem Login kopieren
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

PHP-Entwicklung: So implementieren Sie Funktionen zum Sortieren und Paging von Tabellendaten PHP-Entwicklung: So implementieren Sie Funktionen zum Sortieren und Paging von Tabellendaten Sep 20, 2023 am 11:28 AM

PHP-Entwicklung: So implementieren Sie Sortier- und Paging-Funktionen für Tabellendaten. In der Webentwicklung ist die Verarbeitung großer Datenmengen eine häufige Aufgabe. Bei Tabellen, die große Datenmengen anzeigen müssen, ist es normalerweise erforderlich, Datensortierungs- und Paging-Funktionen zu implementieren, um eine gute Benutzererfahrung zu bieten und die Systemleistung zu optimieren. In diesem Artikel wird die Verwendung von PHP zum Implementieren der Sortier- und Paging-Funktionen von Tabellendaten vorgestellt und spezifische Codebeispiele gegeben. Die Sortierfunktion implementiert die Sortierfunktion in der Tabelle und ermöglicht Benutzern die Sortierung in aufsteigender oder absteigender Reihenfolge nach verschiedenen Feldern. Das Folgende ist ein Implementierungsformular

Huawei wird nächstes Jahr innovative MED-Speicherprodukte auf den Markt bringen: Die Rack-Kapazität übersteigt 10 PB und der Stromverbrauch beträgt weniger als 2 kW Huawei wird nächstes Jahr innovative MED-Speicherprodukte auf den Markt bringen: Die Rack-Kapazität übersteigt 10 PB und der Stromverbrauch beträgt weniger als 2 kW Mar 07, 2024 pm 10:43 PM

Diese Website berichtete am 7. März, dass Dr. Zhou Yuefeng, Präsident der Datenspeicherproduktlinie von Huawei, kürzlich an der MWC2024-Konferenz teilgenommen und speziell die magnetoelektrische Speicherlösung OceanStorArctic der neuen Generation vorgestellt hat, die für warme Daten (WarmData) und kalte Daten (ColdData) entwickelt wurde. Zhou Yuefeng, Präsident der Datenspeicherproduktlinie von Huawei, hat eine Reihe innovativer Lösungen veröffentlicht: Die dieser Website beigefügte offizielle Pressemitteilung von Huawei lautet wie folgt: Die Kosten dieser Lösung sind 20 % niedriger als die von Magnetbändern Der Stromverbrauch ist 90 % niedriger als der von Festplatten. Laut Foreign Technology Media BlocksandFiles gab ein Huawei-Sprecher auch Informationen über die magnetoelektrische Speicherlösung preis: Huaweis magnetoelektronische Disk (MED) sei eine bedeutende Innovation bei magnetischen Speichermedien. ME der ersten Generation

Vue3+TS+Vite-Entwicklungsfähigkeiten: So verschlüsseln und speichern Sie Daten Vue3+TS+Vite-Entwicklungsfähigkeiten: So verschlüsseln und speichern Sie Daten Sep 10, 2023 pm 04:51 PM

Vue3+TS+Vite-Entwicklungstipps: So verschlüsseln und speichern Sie Daten Mit der rasanten Entwicklung der Internettechnologie werden Datensicherheit und Datenschutz immer wichtiger. In der Vue3+TS+Vite-Entwicklungsumgebung ist die Verschlüsselung und Speicherung von Daten ein Problem, mit dem sich jeder Entwickler auseinandersetzen muss. In diesem Artikel werden einige gängige Techniken zur Datenverschlüsselung und -speicherung vorgestellt, um Entwicklern dabei zu helfen, die Anwendungssicherheit und das Benutzererlebnis zu verbessern. 1. Datenverschlüsselung Front-End-Datenverschlüsselung Die Front-End-Verschlüsselung ist ein wichtiger Bestandteil des Schutzes der Datensicherheit. Häufig verwendet

So verbinden Sie PHP mit der MSSQL-Datenbank So verbinden Sie PHP mit der MSSQL-Datenbank Oct 23, 2023 pm 12:02 PM

Zu den Methoden, mit denen PHP eine Verbindung zur MSSQL-Datenbank herstellen kann, gehören die Verwendung der MSSQL-Erweiterung von PHP, die Verwendung von PDO usw. Detaillierte Einführung: 1. Verwenden Sie die MSSQL-Erweiterungsmethode von PHP, um sicherzustellen, dass PHP die MSSQL-Erweiterung installiert hat. Sie können überprüfen, ob die MSSQL-Erweiterung in der PHP-Konfigurationsdatei (php.ini) aktiviert ist. 2. Verwenden Sie die PDO-Methode, um sicherzustellen, dass PHP die PDO-Erweiterung installiert hat. Sie können überprüfen, ob die pdo_sqlsrv-Erweiterung in der PHP-Konfigurationsdatei (php.ini) aktiviert ist.

Detaillierte Anleitung zur Installation von PHP und zur Konfiguration der MSSQL-Verbindung unter Ubuntu Detaillierte Anleitung zur Installation von PHP und zur Konfiguration der MSSQL-Verbindung unter Ubuntu Feb 29, 2024 am 11:15 AM

Ubuntu ist ein beliebtes Open-Source-Betriebssystem, das häufig zum Betrieb von Servern verwendet wird. Die Installation von PHP und die Konfiguration von MSSQL-Verbindungen unter Ubuntu gehören zu den Vorgängen, die viele Entwickler und Systemadministratoren häufig ausführen müssen. Dieser Artikel bietet den Lesern eine detaillierte Anleitung, einschließlich der Schritte zur Installation von PHP, der Einrichtung von Apache, der Installation von MSSQLServer usw. sowie dem Anhängen spezifischer Codebeispiele. Schritt 1: PHP und zugehörige Erweiterungen installieren Zuerst müssen wir PHP und zugehörige Erweiterungen installieren, um PHP-Verbindungen zu unterstützen

Wie verwende ich JavaScript, um die Tabellen-Paging-Funktion zu implementieren? Wie verwende ich JavaScript, um die Tabellen-Paging-Funktion zu implementieren? Oct 20, 2023 pm 06:19 PM

Wie verwende ich JavaScript, um die Tabellen-Paging-Funktion zu implementieren? Mit der Entwicklung des Internets verwenden immer mehr Websites Tabellen zur Darstellung von Daten. In einigen Fällen, in denen die Datenmenge groß ist, müssen die Daten auf Seiten angezeigt werden, um die Benutzererfahrung zu verbessern. In diesem Artikel wird erläutert, wie Sie JavaScript zum Implementieren der Tabellen-Paging-Funktion verwenden, und es werden spezifische Codebeispiele bereitgestellt. 1. HTML-Struktur Zuerst müssen wir eine HTML-Struktur vorbereiten, um Tabellen und Paging-Schaltflächen zu hosten. Wir können &lt;tab verwenden

Git-Installationsprozess unter Ubuntu Git-Installationsprozess unter Ubuntu Mar 20, 2024 pm 04:51 PM

Git ist ein schnelles, zuverlässiges und anpassungsfähiges verteiltes Versionskontrollsystem. Es ist für die Unterstützung verteilter, nichtlinearer Arbeitsabläufe konzipiert und eignet sich daher ideal für Softwareentwicklungsteams jeder Größe. Jedes Git-Arbeitsverzeichnis ist ein unabhängiges Repository mit einem vollständigen Verlauf aller Änderungen und der Möglichkeit, Versionen auch ohne Netzwerkzugriff oder einen zentralen Server zu verfolgen. GitHub ist ein in der Cloud gehostetes Git-Repository, das alle Funktionen der verteilten Revisionskontrolle bietet. GitHub ist ein Git-Repository, das in der Cloud gehostet wird. Im Gegensatz zu Git, einem CLI-Tool, verfügt GitHub über eine webbasierte grafische Benutzeroberfläche. Es wird zur Versionskontrolle verwendet, was die Zusammenarbeit mit anderen Entwicklern und die Verfolgung von Änderungen an Skripten und anderen umfasst

Ausführliche Erläuterung des Prinzips des MyBatis-Paging-Plug-Ins Ausführliche Erläuterung des Prinzips des MyBatis-Paging-Plug-Ins Feb 22, 2024 pm 03:42 PM

MyBatis ist ein hervorragendes Persistenzschicht-Framework, das Datenbankoperationen basierend auf XML und Anmerkungen unterstützt. Es ist einfach und benutzerfreundlich und bietet außerdem einen umfangreichen Plug-In-Mechanismus. Unter diesen ist das Paging-Plugin eines der am häufigsten verwendeten Plug-Ins. Dieser Artikel befasst sich mit den Prinzipien des MyBatis-Paging-Plug-Ins und veranschaulicht es anhand konkreter Codebeispiele. 1. Paging-Plug-In-Prinzip MyBatis selbst bietet keine native Paging-Funktion, Sie können jedoch Plug-Ins verwenden, um Paging-Abfragen zu implementieren. Das Prinzip des Paging-Plug-Ins besteht hauptsächlich darin, MyBatis abzufangen

See all articles