自开始做项目以来,一直在用。这段存储过程的的原创者(SORRY,忘记名字了),写得这段SQL代码很不错,我在这个基础上,按照我的习惯以及思维方式,调整了代码,只做分页查询用。
 /*----------------------------------------------
 ?*procedure?name?:?prcPageResult
 ?*??author?:?FuChun
 ?*??create?date?:?2006-10-04
 ?*/

CREATE
?
PROCEDURE
?prcPageResult

--
?获得某一页的数据?--

@currPage
?
int
?
=
?
1
,????????????????????????????????????
--
当前页页码?(即Top?currPage)

@showColumn
?
varchar
(
2000
)?
=
?
'
*
'
,???????????
--
需要得到的字段?(即?column1,column2,......)

@tabName
?
varchar
(
2000
),???????????????????????????
--
需要查看的表名?(即?from?table_name)

@strCondition
?
varchar
(
2000
)?
=
?
''
,??????????????
--
查询条件?(即?where?condition......)?不用加where关键字

@ascColumn
?
varchar
(
100
)?
=
?
''
,?????????????????
--
排序的字段名?(即?order?by?column?asc/desc)

@bitOrderType
?
bit
?
=
?
0
,????????????????????????????
--
排序的类型?(0为升序,1为降序)

@pkColumn
?
varchar
(
50
)?
=
?
''
,???????????????????
--
主键名称

@pageSize
?
int
?
=
?
20
????????????????????????????????
--
分页大小


AS

BEGIN
?
--
?存储过程开始
 --
?该存储过程需要用到的几个变量?--

DECLARE
?
@strTemp
?
varchar
(
1000
)

DECLARE
?
@strSql
?
varchar
(
4000
)???????????????????
--
该存储过程最后执行的语句

DECLARE
?
@strOrderType
?
varchar
(
1000
)??????
--
排序类型语句?(order?by?column?asc或者order?by?column?desc)


BEGIN

IF
?
@bitOrderType
?
=
?
1
???
--
?bitOrderType=1即执行降序

BEGIN
 ????
SET
?
@strOrderType
?
=
?
'
?ORDER?BY?
'
+
@ascColumn
+
'
?DESC
'
 ????
SET
?
@strTemp
?
=
?
'
<(SELECT?min
'

END

ELSE

BEGIN
 ????
SET
?
@strOrderType
?
=
?
'
?ORDER?BY?
'
+
@ascColumn
+
'
?ASC
'
 ????
SET
?
@strTemp
?
=
?
'
>(SELECT?max
'

END


IF
?
@currPage
?
=
?
1
????
--
?如果是第一页

BEGIN
 ????
IF
?
@strCondition
?
!=
?
''
 ????????
SET
?
@strSql
?
=
?
'
SELECT?TOP?
'
+
STR
(
@pageSize
)
+
'
?
'
+
@showColumn
+
'
?FROM?
'
+
@tabName
+
 ????????????
'
?WHERE?
'
+
@strCondition
+
@strOrderType
 ????
ELSE
 ????????
SET
?
@strSql
?
=
?
'
SELECT?TOP?
'
+
STR
(
@pageSize
)
+
'
?
'
+
@showColumn
+
'
?FROM?
'
+
@tabName
+
@strOrderType

END


ELSE
????
--
?其他页

BEGIN
 ????
IF
?
@strCondition
?
!=
''
 ????????
SET
?
@strSql
?
=
?
'
SELECT?TOP?
'
+
STR
(
@pageSize
)
+
'
?
'
+
@showColumn
+
'
?FROM?
'
+
@tabName
+
 ????????
'
?WHERE?
'
+
@strCondition
+
'
?AND?
'
+
@pkColumn
+
@strTemp
+
'
(
'
+
@pkColumn
+
'
)
'
+
'
?FROM?(SELECT?TOP?
'
+
STR
((
@currPage
-
1
)
*
@pageSize
)
+
 ????????
'
?
'
+
@pkColumn
+
'
?FROM?
'
+
@tabName
+
@strOrderType
+
'
)?AS?TabTemp)
'
+
@strOrderType
 ????
ELSE
 ????????
SET
?
@strSql
?
=
?
'
SELECT?TOP?
'
+
STR
(
@pageSize
)
+
'
?
'
+
@showColumn
+
'
?FROM?
'
+
@tabName
+
 ????????
'
?WHERE?
'
+
@pkColumn
+
@strTemp
+
'
(
'
+
@pkColumn
+
'
)
'
+
'
?FROM?(SELECT?TOP?
'
+
STR
((
@currPage
-
1
)
*
@pageSize
)
+
'
?
'
+
@pkColumn
+
 ????????
'
?FROM?
'
+
@tabName
+
@strOrderType
+
'
)?AS?TabTemp)
'
+
@strOrderType

END


END

EXEC
?(
@strSql
)

END
??
--
?存储过程结束
 --
----------------------------------------------

GO
?调用方法:
prcPageResult 1,'*','TableName','','CreateDate',1,'PkID',25
?上面表示,查询表TableName的所有字段,前25条记录,因为是第一页,排序字段为CreateDate,降序排列,主键是PkID。这个存储过程的功能比较强大,用在项目中非常的适用。不信您可以试试看,尤其是在百万级数据上,他的优势就显露无疑了,当然,这段代码是可以转换成MySql中的存储过程的,不过,在这里就不给大家了,你们可以自己试着转换看看。
下面的存储过程查询表的记录数:
 /*----------------------------------------------
 ?*procedure?name?:?prcRowsCount
 ?*??author?:?FuChun
 ?*??create?date?:?2006-09-22
 ?*/

CREATE
?
PROC
?prcRowsCount

@tabName
?
varchar
(
200
),????????????
--
需要查询的表名

@colName
?
varchar
(
200
)
=
'
*
'
,????????
--
需要查询的列名

@condition
?
varchar
(
200
)
=
''
???????
--
查询条件

AS

BEGIN
 ????
DECLARE
?
@strSql
?
varchar
(
255
)
 ????
IF
?
@condition
?
=
?
''
 ????????
SET
?
@strSql
=
'
select?count(
'
+
@colName
+
'
)?from?
'
+
@tabName
 ????
ELSE
 ????????
SET
?
@strSql
=
'
select?count(
'
+
@colName
+
'
)?from?
'
+
@tabName
+
'
?where?
'
+
@condition
 ????
EXEC
?(
@strSql
)

END

--
----------------------------------------------

GO
还有删除记录的通用存储过程和查询单条记录的通用存储过程在这里就不奉送了,感谢提供原通用分页查询存储过程的哥们,谢谢。
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|