데이터 베이스 MySQL 튜토리얼 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
로그인 후 복사
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

PHP 개발: 테이블 데이터 정렬 및 페이징 기능 구현 방법 PHP 개발: 테이블 데이터 정렬 및 페이징 기능 구현 방법 Sep 20, 2023 am 11:28 AM

PHP 개발: 테이블 데이터 정렬 및 페이징 기능 구현 방법 웹 개발에서는 대량의 데이터를 처리하는 것이 일반적인 작업입니다. 많은 양의 데이터를 표시해야 하는 테이블의 경우 일반적으로 좋은 사용자 경험을 제공하고 시스템 성능을 최적화하기 위해 데이터 정렬 및 페이징 기능을 구현해야 합니다. 이 기사에서는 PHP를 사용하여 테이블 데이터의 정렬 및 페이징 기능을 구현하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 정렬 기능은 테이블에 정렬 기능을 구현하여 사용자가 다양한 필드에 따라 오름차순 또는 내림차순으로 정렬할 수 있도록 합니다. 다음은 구현 형태이다

화웨이는 내년에 혁신적인 MED 스토리지 제품을 출시할 예정입니다. 랙 용량은 10PB를 초과하고 전력 소비량은 2kW 미만입니다. 화웨이는 내년에 혁신적인 MED 스토리지 제품을 출시할 예정입니다. 랙 용량은 10PB를 초과하고 전력 소비량은 2kW 미만입니다. Mar 07, 2024 pm 10:43 PM

이 웹사이트는 3월 7일 화웨이의 데이터 스토리지 제품 라인 사장인 Zhou Yuefeng 박사가 최근 MWC2024 컨퍼런스에 참석하여 웜 데이터(WarmData)와 콜드 데이터(ColdData)용으로 설계된 차세대 OceanStorArctic 자전 스토리지 솔루션을 구체적으로 시연했다고 보도했습니다. Huawei의 데이터 스토리지 제품 라인 사장 Zhou Yuefeng은 일련의 혁신적인 솔루션을 출시했습니다. 이미지 출처: 이 사이트에 첨부된 Huawei의 공식 보도 자료는 다음과 같습니다. 이 솔루션의 가격은 자기 테이프보다 20% 저렴하며, 전력 소비는 하드 디스크보다 90% 낮습니다. 해외 기술 매체인 blockandfiles에 따르면, Huawei 대변인은 자기전기 저장 솔루션에 대한 정보도 공개했습니다. Huawei의 자기전자 디스크(MED)는 자기 저장 매체의 주요 혁신입니다. 1세대 ME

Vue3+TS+Vite 개발 기술: 데이터 암호화 및 저장 방법 Vue3+TS+Vite 개발 기술: 데이터 암호화 및 저장 방법 Sep 10, 2023 pm 04:51 PM

Vue3+TS+Vite 개발 팁: 데이터를 암호화하고 저장하는 방법 인터넷 기술의 급속한 발전으로 인해 데이터 보안 및 개인 정보 보호가 점점 더 중요해지고 있습니다. Vue3+TS+Vite 개발 환경에서 데이터를 암호화하고 저장하는 방법은 모든 개발자가 직면해야 하는 문제입니다. 이 기사에서는 개발자가 애플리케이션 보안 및 사용자 경험을 개선하는 데 도움이 되는 몇 가지 일반적인 데이터 암호화 및 저장 기술을 소개합니다. 1. 데이터 암호화 프런트엔드 데이터 암호화 프런트엔드 암호화는 데이터 보안을 보호하는 중요한 부분입니다. 일반적으로 사용되는

PHP를 mssql 데이터베이스에 연결하는 방법 PHP를 mssql 데이터베이스에 연결하는 방법 Oct 23, 2023 pm 12:02 PM

PHP가 mssql 데이터베이스에 연결하는 방법에는 PHP의 MSSQL 확장 사용, PDO 사용 등이 포함됩니다. 자세한 소개: 1. PHP의 MSSQL 확장 방법을 사용하여 PHP에 MSSQL 확장이 설치되어 있는지 확인합니다. mssql 확장이 활성화되어 있는지 여부는 PHP 구성 파일(php.ini)에서 확인할 수 있습니다. 2. PDO 메서드를 사용하여 PHP에 PDO 확장이 설치되어 있는지 확인하세요. PHP 구성 파일(php.ini)에서 pdo_sqlsrv 확장이 활성화되어 있는지 확인할 수 있습니다.

Ubuntu에서 PHP를 설치하고 MSSQL 연결을 구성하는 방법에 대한 자세한 가이드 Ubuntu에서 PHP를 설치하고 MSSQL 연결을 구성하는 방법에 대한 자세한 가이드 Feb 29, 2024 am 11:15 AM

Ubuntu는 서버를 실행하는 데 일반적으로 사용되는 인기 있는 오픈 소스 운영 체제입니다. Ubuntu에 PHP를 설치하고 MSSQL 연결을 구성하는 것은 많은 개발자와 시스템 관리자가 자주 수행해야 하는 작업 중 하나입니다. 이 기사에서는 독자들에게 PHP 설치, Apache 설정, MSSQLServer 설치 등의 단계를 포함한 자세한 가이드를 제공하고 특정 코드 예제를 첨부합니다. 1단계: PHP 및 관련 확장 설치 먼저, PHP 연결을 지원하기 위해 PHP 및 관련 확장을 설치해야 합니다.

JavaScript를 사용하여 테이블 페이징 기능을 구현하는 방법은 무엇입니까? JavaScript를 사용하여 테이블 페이징 기능을 구현하는 방법은 무엇입니까? Oct 20, 2023 pm 06:19 PM

JavaScript를 사용하여 테이블 페이징 기능을 구현하는 방법은 무엇입니까? 인터넷이 발달하면서 점점 더 많은 웹사이트에서 데이터를 표시하기 위해 테이블을 사용하고 있습니다. 데이터 양이 많은 경우에는 사용자 경험을 개선하기 위해 데이터를 페이지에 표시해야 합니다. 이 기사에서는 JavaScript를 사용하여 테이블 페이징 기능을 구현하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 1. HTML 구조 먼저 테이블과 페이징 버튼을 호스팅할 HTML 구조를 준비해야 합니다. &lt;tab을 ​​사용할 수 있습니다.

우분투에서의 Git 설치 과정 우분투에서의 Git 설치 과정 Mar 20, 2024 pm 04:51 PM

Git은 빠르고 안정적이며 적응력이 뛰어난 분산 버전 제어 시스템입니다. 분산된 비선형 워크플로를 지원하도록 설계되어 모든 규모의 소프트웨어 개발 팀에 이상적입니다. 각 Git 작업 디렉터리는 모든 변경 사항에 대한 전체 기록을 보유하고 네트워크 액세스나 중앙 서버 없이도 버전을 추적할 수 있는 독립적인 저장소입니다. GitHub는 분산 개정 제어의 모든 기능을 제공하는 클라우드에 호스팅되는 Git 저장소입니다. GitHub는 클라우드에서 호스팅되는 Git 저장소입니다. CLI 도구인 Git과 달리 GitHub에는 웹 기반 그래픽 사용자 인터페이스가 있습니다. 이는 다른 개발자와 협력하고 스크립트 변경 사항을 추적하는 버전 제어에 사용됩니다.

MyBatis 페이징 플러그인의 원리에 대한 자세한 설명 MyBatis 페이징 플러그인의 원리에 대한 자세한 설명 Feb 22, 2024 pm 03:42 PM

MyBatis는 XML과 주석을 기반으로 하는 뛰어난 지속성 레이어 프레임워크입니다. 또한 간단하고 사용하기 쉬운 플러그인 메커니즘도 제공합니다. 그 중 페이징 플러그인은 가장 많이 사용되는 플러그인 중 하나입니다. 이 기사에서는 MyBatis 페이징 플러그인의 원리를 자세히 살펴보고 특정 코드 예제를 통해 설명합니다. 1. 페이징 플러그인 원리 MyBatis 자체는 기본 페이징 기능을 제공하지 않지만 플러그인을 사용하여 페이징 쿼리를 구현할 수 있습니다. 페이징 플러그인의 원리는 주로 MyBatis를 가로채는 것입니다.

See all articles