惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

GbyAI
GbyAI
J
Java Code Geeks
雷峰网
雷峰网
WordPress大学
WordPress大学
宝玉的分享
宝玉的分享
云风的 BLOG
云风的 BLOG
V
Visual Studio Blog
V
Vulnerabilities – Threatpost
S
Securelist
The Hacker News
The Hacker News
The Register - Security
The Register - Security
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Help Net Security
Help Net Security
G
Google Developers Blog
Hugging Face - Blog
Hugging Face - Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
M
MIT News - Artificial intelligence
AI
AI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
The GitHub Blog
The GitHub Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Schneier on Security
Schneier on Security
N
Netflix TechBlog - Medium
T
The Blog of Author Tim Ferriss
Google DeepMind News
Google DeepMind News
Hacker News - Newest:
Hacker News - Newest: "LLM"
H
Hacker News: Front Page
博客园 - 司徒正美
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
B
Blog
Microsoft Azure Blog
Microsoft Azure Blog
大猫的无限游戏
大猫的无限游戏
Security Latest
Security Latest
Engineering at Meta
Engineering at Meta
N
News and Events Feed by Topic
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
酷 壳 – CoolShell
酷 壳 – CoolShell
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
T
Threat Research - Cisco Blogs
U
Unit 42
V
V2EX
V2EX - 技术
V2EX - 技术
L
LINUX DO - 最新话题
aimingoo的专栏
aimingoo的专栏
Microsoft Security Blog
Microsoft Security Blog
Recorded Future
Recorded Future
P
Privacy & Cybersecurity Law Blog
美团技术团队
小众软件
小众软件
F
Fortinet All Blogs

博客园 - 雪夜

VS统计代码量 DataTable 操作 - 雪夜 - 博客园 统计销售额 bootstrap 知识点 人脸识别 参考 转盒子 年龄段统计 model 数据注解 delphi ScriptGate 调用JS C#区块链零基础入门,学习路线图 转 SQLServer 2005 和自增长主键identity说再见——NEWSEQUENTIALID() ASP.NET Core and .NET Core Library Support 创新县(市、区)的主要条件 C# imgage图片转base64字符/base64字符串转图片另存成 base64编码的 文件 图片 CSS - 雪夜 - 博客园 Exception has been thrown by the target of an invocation 网站报错 JavaScript 知识记录 JQuery 全选 取消 博文阅读密码验证 - 博客园
高效通用分页存储过程 多表查询
雪夜 · 2017-07-26 · via 博客园 - 雪夜
DECLARE	@return_value int,
		@TotalCount int,
		@TotalPageCount int

EXEC	@return_value = [dbo].[UP_GetRecordByPageOrder]
		@tblName = N'dbo.task AS ts  LEFT JOIN dbo.task_scinfo AS sc ON ts.id = sc.sc_rwid',
		@fldName = N'ts.id,ts.class_name,ts.task_name,ts.file_url,sc.id AS scid',
		@strWhere = N'ts.islock = 0',
		@OrderfldName = N'ts.id asc',
		@PageSize = 10,
		@PageIndex = 0,
		@TotalCount = @TotalCount OUTPUT,
		@TotalPageCount = @TotalPageCount OUTPUT

SELECT	@TotalCount as N'@TotalCount',
		@TotalPageCount as N'@TotalPageCount'

SELECT	'Return Value' = @return_value

GO

UP_GetRecordByPageOrder

CREATE PROC [dbo].[UP_GetRecordByPageOrder]
/*
nzperfect [no_mIss] 高效通用分页存储过程(双向检索) 2009.4.22 
敬告:适用于单一主键或存在唯一值列的表或视图
ps:Sql语句为8000字节,调用时请注意传入参数及sql总长度不要超过指定范围
*/
@tblName VARCHAR(255),    --表名
@fldName VARCHAR(255),    --显示列名,如果是全部字段则为*
@strWhere VARCHAR(1000),        --查询条件 不含'where'字符,如id>10 and len(userid)>9
@OrderfldName VARCHAR(255),        --排序(多列排序情况) 不含'order by'字符,如id asc,userid desc,必须指定asc或desc
--注意当@SortType=3时生效,记住一定要在最后加上主键,否则会让你比较郁闷
@PageSize INT =10,              --每页输出的记录数
@PageIndex INT =1,              --当前页数
@IsRecount bit =0,
@RecorderCount INT =0,          --记录总数 1:会返回总记录
@TotalCount INT =0 OUTPUT,      --记返回总记录
@TotalPageCount INT =0 OUTPUT  --返回总页数

AS
----------------参数验证-----------------
SET NOCOUNT ON
--总页数
IF ISNULL(@TotalCount,'') = '' SET @TotalCount = 0
--排序方式
SET @OrderfldName = RTRIM(LTRIM(@OrderfldName))
--字段列表
--SET @fldName = REPLACE(RTRIM(LTRIM(@fldName)),' ','')
--排序表达式整理
WHILE CHARINDEX(', ',@OrderfldName) > 0 OR CHARINDEX(' ,',@OrderfldName) > 0
  BEGIN
    SET @OrderfldName = REPLACE(@OrderfldName,', ',',')
    SET @OrderfldName = REPLACE(@OrderfldName,' ,',',')
  END
IF ISNULL(@tblName,'') = '' OR ISNULL(@fldName,'') = ''
OR @RecorderCount  < 0 OR @PageSize < 0 OR @PageIndex < 0
BEGIN
PRINT('ERR_00')
RETURN
END

-------------------处理排序表达式----------------
BEGIN
IF (UPPER(RIGHT(@OrderfldName,4))!=' ASC' AND UPPER(RIGHT(@OrderfldName,5))!=' DESC')
BEGIN PRINT('ERR_02') RETURN END
END
DECLARE @new_where1 VARCHAR(1000)
DECLARE @new_where2 VARCHAR(1000)
DECLARE @new_order1 VARCHAR(1000)
DECLARE @new_order2 VARCHAR(1000)
DECLARE @new_order3 VARCHAR(1000)
DECLARE @temptable VARCHAR(1000)
DECLARE @Sql VARCHAR(8000)
DECLARE @SqlCount NVARCHAR(4000)

SET @temptable=@tblName

IF ISNULL(@strWhere,'') = ''
BEGIN
SET @new_where1 = ' '
SET @new_where2 = ' WHERE  '
END
ELSE
BEGIN
SET @new_where1 = ' WHERE ' + @strWhere
SET @new_where2 = ' WHERE ' + @strWhere + ' AND '
END

BEGIN
SET @new_order1 = ' ORDER BY ' + @OrderfldName
END

BEGIN
SET @new_order1 = ' ORDER BY ' + @OrderfldName
SET @new_order2 = @OrderfldName + ','
SET @new_order2 = REPLACE(REPLACE(@new_order2,'ASC,','{ASC},'),'DESC,','{DESC},')
SET @new_order2 = REPLACE(REPLACE(@new_order2,'{ASC},','DESC,'),'{DESC},','ASC,')
SET @new_order2 = ' ORDER BY ' + SUBSTRING(@new_order2,1,LEN(@new_order2)-1)

IF @fldName <> '*'
BEGIN
SET @new_order3 = REPLACE(REPLACE(@OrderfldName + ',','ASC,',','),'DESC,',',')
SET @fldName = ',' + @fldName
WHILE CHARINDEX(',',@new_order3)>0
  BEGIN
  IF CHARINDEX(SUBSTRING(','+@new_order3,1,CHARINDEX(',',@new_order3)),','+@fldName+',')>0
  BEGIN
  SET @fldName =
  @fldName + ',' + SUBSTRING(@new_order3,1,CHARINDEX(',',@new_order3))
  END
  SET @new_order3 =
  SUBSTRING(@new_order3,CHARINDEX(',',@new_order3)+1,LEN(@new_order3))
  END
  SET @fldName = SUBSTRING(@fldName,2,LEN(@fldName))
END
END

------根据所要取的记录数@RecorderCount取出总记录数及总页数
SET @SqlCount = 'SELECT @TotalCount=COUNT(1),@TotalPageCount=CEILING((COUNT(1)+0.0)/'
+ CAST(@PageSize AS VARCHAR)+') FROM ' + @temptable + @new_where1

IF @RecorderCount  = 0
 BEGIN
  EXEC SP_EXECUTESQL @SqlCount,N'@TotalCount INT OUTPUT,@TotalPageCount INT OUTPUT',
  @TotalCount OUTPUT,@TotalPageCount OUTPUT
 END
ELSE
 BEGIN
  SELECT @TotalCount = @RecorderCount,@TotalPageCount=CEILING((@TotalCount+0.0)/@PageSize)
  set @SqlCount='drop table temp select TOP('+CAST(@TotalCount As varchar)+') * into temp from '+@temptable+ @new_where1 + @new_order1
  exec sp_executesql @SqlCount
  set @temptable='temp'
 END
--------------------------取数据------------------------
IF @PageIndex = 1 OR @PageIndex >= CEILING((@TotalCount+0.0)/@PageSize) OR @PageIndex =0
 BEGIN
  IF @PageIndex = 1 OR @PageIndex =0 --返回第一页数据
   BEGIN
    SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @fldName + ' FROM '
    + @temptable + @new_where1 + @new_order1
   END
  IF @PageIndex >= CEILING((@TotalCount+0.0)/@PageSize)  --返回最后一页数据
   BEGIN
    SET @PageIndex =  CEILING((@TotalCount+0.0)/@PageSize)
    SET @Sql = 'SELECT TOP ' +STR(@TotalCount-@PageSize*(@TotalPageCount-1)) + ' * FROM ('
     + 'SELECT TOP ' + STR(ABS(@PageSize*@PageIndex-@TotalCount-@PageSize))
     + ' ' + @fldName + ' FROM '
     + @temptable + @new_where1 + @new_order2 + ' ) AS TMP '
     + @new_order1
   END
 END
ELSE
 BEGIN
---------------------------输出数据-------------------------------
  IF @PageIndex <= CEILING((@TotalCount+0.0)/@PageSize)/2  --正向检索
   BEGIN
    SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' * FROM ( '
    + 'SELECT TOP ' + STR(@PageSize) + ' * FROM ( '
    + ' SELECT TOP ' + STR(@PageSize*@PageIndex) + ' ' + @fldName
    + ' FROM ' + @temptable + @new_where1 + @new_order1 + ' ) AS TMP '
    + @new_order2 + ' ) AS TMP ' + @new_order1
   END
  ELSE  --反向检索
   BEGIN
    SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' * FROM ( '
    + 'SELECT TOP ' + STR(@PageSize) + ' * FROM ( '
    + ' SELECT TOP ' + STR(@TotalCount-@PageSize *@PageIndex+@PageSize) + ' ' + @fldName
    + ' FROM ' + @temptable + @new_where1 + @new_order2 + ' ) AS TMP '
    + @new_order1 + ' ) AS TMP ' + @new_order1
   END
 END

EXEC(@Sql)