zoukankan
html css js c++ java
分页存储过程,可支持多表查询,任意排序。
注意:该存储过程处理逻辑被发现有严重错误,并不能实现 任意排序等功能。
/**/
/*
说明:1.支持多表查询 2.支持任意排序 3.不支持表别名
参考了
evafly920:[分享]千万数量级分页存储过程(效果演示)
地址:http://blog.csdn.net/evafly920/archive/2006/03/03/614813.aspx
IF(EXISTS(SELECT * FROM sysobjects WHERE [id]=OBJECT_ID('usp_PagingLarge') AND xtype='P'))
DROP PROCEDURE usp_PagingLarge
*/
GO
CREATE
PROCEDURE
usp_PagingLarge
@TableNames
VARCHAR
(
200
),
--
表名,可以是多个表,但不能用别名
@PrimaryKey
VARCHAR
(
100
),
--
主键,可以为空,但@Order为空时该值不能为空
@Fields
VARCHAR
(
200
),
--
要取出的字段,可以是多个表的字段,可以为空,为空表示select *
@PageSize
INT
,
--
每页记录数
@CurrentPage
INT
,
--
当前页,0表示第1页
@Filter
VARCHAR
(
200
)
=
''
,
--
条件,可以为空,不用填 where
@Group
VARCHAR
(
200
)
=
''
,
--
分组依据,可以为空,不用填 group by
@Order
VARCHAR
(
200
)
=
''
--
排序,可以为空,为空默认按主键升序排列,不用填 order by
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
,
@pos1
-
@pos2
-
1
)
ELSE
SET
@SortName
=
SUBSTRING
(
@SortColumn
,
@pos2
+
1
,
LEN
(
@SortColumn
)
-
@pos2
)
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
+
'
'
)
END
GO
--
调用例子:
--
1.单表/单排序
EXEC
usp_PagingLarge
'
bigtable
'
,
'
d_id
'
,
'
d_id,d_title,d_content,d_time
'
,
20
,
1
,
''
,
''
,
'
d_id desc
'
--
2.单表/多排序
EXEC
usp_PagingLarge
'
bigtable
'
,
'
d_id
'
,
'
*
'
,
20
,
0
,
''
,
''
,
'
d_time asc,d_id desc
'
--
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_id asc
'
--
4.多表/多排序
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_time asc,bigtable.d_id desc
'
与自定义分页结合例子:
/Files/jiny-z/Paging_Custom.rar
查看全文
相关阅读:
Web Client Software Factory 开发路线图
Castle ActiveRecord Hands On Lab(1):基本数据访问
古代武侠武功与现代软件开发
微软Code Snippet Designer Alpha版发布了
MSDN WebCast网站全新改版
AJAX,只是一种过渡技术吗?
中文网站排行榜:博客园位居博客类16名
ASP.NET AJAX JavaScript 类浏览器
.NET开源项目介绍及资源推荐:序
微软发布WF教程及大量示例
原文地址:https://www.cnblogs.com/xlfj521/p/949428.html
最新文章
S2JDBC ブラッシュアップ
shell脚本基本语法学习
プロパティ取得
Java读写CSV文件
Linux shell脚本中判断变量文件目录:权限、是否存在、空值、相等
图解分布式系统架构演进之路
反向代理的作用
千万流量的大型分布式系统架构设计技术总结
FFmpeg数据结构AVFrame
什么是服务的幂等性设计
热门文章
Git Extension工具安装及使用
服务端高并发分布式架构演进之路
认识 MySQL 和 Redis 的数据一致性问题
Redis 那些故障转移、高可用方案
缓存和数据库一致性问题,看这篇就够了
其它 Helper
关于字符串, 之前没这样用过
曾经被忽视的两个小功能
多线程编程, 这三个方法够我用了.
测试 System.SysUtils.TStringHelper
Copyright © 2011-2022 走看看