EXEC XK_Counter_UpdateEveryDayRankTempTable
sp_helptext XK_Counter_UpdateEveryDayRankTempTable
select getdate()
exec GetPagingData
'
article
'
,
'
*
'
,
'
UpdateTime
'
,
'
id
'
,
1
,
20
,
'
1=1
'
,
1
select getdate()
select getdate()
exec GZ_News_GetSQLSearchResults
20
,
1
,
''
select getdate()
sp_helptext GZ_News_GetSQLSearchResults
-------------------------
以下为临时表分页存储过程(不会有排序字段的影响)
--------------------------------------------------------
CREATE PROCEDURE GZ_News_GetSQLSearchResults
(
@PageSize
int
,
@PageIndex
int
,
@Content varchar(
20
)
)
AS
SET NOCOUNT ON
DECLARE @PageLowerBound
int
DECLARE @PageUpperBound
int
DECLARE @RowsToReturn
int
DECLARE @MoreRecords
int
SET @RowsToReturn
=
@PageSize
*
@PageIndex
SET @MoreRecords
=
@RowsToReturn
+
1
SET ROWCOUNT @MoreRecords
SET @PageLowerBound
=
@PageSize
*
(@PageIndex
-
1
)
SET @PageUpperBound
=
@PageLowerBound
+
@PageSize
+
1
CREATE TABLE #PageIndex
(
IndexID
int
IDENTITY (
1
,
1
) NOT NULL,
UpdateTime datetime,
ArticleID
int
)
if
((@Content
is
not
null
) and (@Content
<>
''
))
INSERT INTO #PageIndex (ArticleID,UpdateTime)
(SELECT ArticleID,UpdateTime FROM Article a WHERE Contains(Content, @Content)
union
SELECT ArticleID,UpdateTime FROM Article a where Contains(Title,@Content)) ORDER BY UpdateTime Desc
else
INSERT INTO #PageIndex(ArticleID)
SELECT ArticleID FROM Article a Order By UpdateTime desc
/*
IF (@MoreRecords > (SELECT count(*) FROM #PageIndex))
SET @MoreRecords = @RowsToReturn
*/
SELECT
a.ArticleID,
a.Title,
a.UpdateTime,
a.Content,
a.IncludePic,
a.DefaultPicUrl,
a.CopyFrom
FROM
#PageIndex PageIndex,
Article a
WHERE
a.ArticleID
=
PageIndex.ArticleID AND
PageIndex.IndexID
>
@PageLowerBound AND
PageIndex.IndexID
<
@PageUpperBound
ORDER BY
PageIndex.IndexID
SET NOCOUNT OFF
-----------------------------------------------------------
排序类型
----------------------------------------------------------------------
drop proc getpagingdata
create PROCEDURE dbo.GetPagingData
(
@tablename varchar(
100
),
--
表名或视图表
@fieldlist varchar(
4000
)
=
'
*
'
,
--
欲选择字段列表
@orderfield varchar(
100
),
--
排序字段
@keyfield varchar(
100
),
--
主键
@pageindex
int
,
--
页号,从0开始
@pagesize
int
=
20
,
--
页尺寸
@strwhere varchar(
4000
),
--
条件
@ordertype bit
=
1
--
排序,
1
,降序,
0
,升序
)
AS
SET NOCOUNT ON
declare @sqlstr varchar(
6000
)
--
处理SQL中危险字符,并且将条件处理成易嵌入的形式
set
@sqlstr
=
'
declare @Rcount int;
'
--
set
@sqlstr
=
@sqlstr
+
'
set @rcount=(select count(
'
+
@keyfield
+
'
) from
'
+
@tablename
+
'
where
'
+
@strWhere
+
'
);
'
set
@sqlstr
=
@sqlstr
+
'
set @rcount=1000
'
set
@strwhere
=
replace(@strwhere,
''''
,
''''''
)
set
@strwhere
=
replace(@strwhere,
'
--
'
,
''
)
set
@strwhere
=
replace(@strwhere,
'
;
'
,
''
)
set
@sqlstr
=
@sqlstr
+
'
declare @Rnum int;
'
set
@sqlstr
=
@sqlstr
+
'
set @rnum=@rcount-
'
+
cast(@pagesize
as
varchar)
+
'
*
'
+
cast(@pageindex
as
varchar)
+
'
;
'
set
@sqlstr
=
@sqlstr
+
'
declare @sqlstr varchar(6000);
'
if
@ordertype
=
1
begin
set
@sqlstr
=
@sqlstr
+
'
set @sqlstr=
''
select top
'
+
cast(@Pagesize
as
varchar)
+
'
'
+
@fieldlist
+
'
from (select top 100
percent
*
from (select top
''
+
cast(@rnum
as
varchar)
+
''
*
from
'
+@tablename+
'
where
'
+@strwhere+
'
order by
'
+@orderfield+
'
asc)
as
b order by UpdateTime desc)
as
a order by
'
+@orderfield+
'
desc
''
;
'
end
else
begin
set
@sqlstr
=
@sqlstr
+
'
set @sqlstr=
''
select top
'
+
cast(@Pagesize
as
varchar)
+
'
'
+
@fieldlist
+
'
from (select top 100
percent
*
from (select top
''
+
cast(@rnum
as
varchar)
+
''
*
from
'
+@tablename+
'
where
'
+@strwhere+
'
order by
'
+@orderfield+
'
desc)
as
b order by UpdateTime asc)
as
a order by
'
+@orderfield+
'
asc
''
;
'
end
set
@sqlstr
=
@sqlstr
+
'
if @Rcount>0 begin execute(@sqlstr) end
'
print @sqlstr
execute(@sqlstr)
go
-------------------------------------------------
not
in
---------------------------------------------------------------------
select getdate()
exec GetPagingRecord_notin
'
article
'
,
'
*
'
,
'
UpdateTime
'
,
'
id
'
,
0
,
20
,
'
1=1
'
,
1
select getdate()
create PROCEDURE dbo.GetPagingRecord_notin
(
@tablename varchar(
100
),
--
表名或视图表
@fieldlist varchar(
4000
)
=
'
*
'
,
--
欲选择字段列表
@orderfield varchar(
100
),
--
排序字段
@keyfield varchar(
100
),
--
主键
@pageindex
int
,
--
页号,从0开始
@pagesize
int
=
20
,
--
页尺寸
@strwhere varchar(
4000
),
--
条件
@ordertype bit
=
1
--
排序,
1
,降序,
0
,升序
)
AS
SET NOCOUNT ON
declare @sqlstr varchar(
6000
)
--
处理SQL中危险字符,并且将条件处理成易嵌入的形式
set
@strwhere
=
replace(@strwhere,
''''
,
''''''
)
set
@strwhere
=
replace(@strwhere,
'
--
'
,
''
)
set
@strwhere
=
replace(@strwhere,
'
;
'
,
''
)
set
@sqlstr
=
'
declare @CurPageNum int;
'
set
@sqlstr
=
@sqlstr
+
'
declare @nextpagenum int;
'
set
@sqlstr
=
@sqlstr
+
'
set @curpagenum=
'
+
cast(@PageIndex
as
varchar)
+
'
*
'
+
cast(@Pagesize
as
varchar)
+
'
;
'
set
@sqlstr
=
@sqlstr
+
'
set @nextpagenum=
'
+
cast(@PageIndex
+
1
as
varchar)
+
'
*
'
+
cast(@Pagesize
as
varchar)
+
'
;
'
set
@sqlstr
=
@sqlstr
+
'
declare @sqlstr varchar(6000);
'
if
@ordertype
=
1
begin
set
@sqlstr
=
@sqlstr
+
'
set @sqlstr=
''
select
'
+
@fieldlist
+
'
from ( select top
''
+cast(@nextpagenum as varchar)+
''
* from
'
+@tablename+
'
where
'
+@strwhere+
'
order by
'
+@orderfield+
'
desc )
as
a where
'
+@keyfield+
'
not
in
(
select top
''
+
cast(@curpagenum
as
varchar)
+
''
'
+@keyfield+
'
from
'
+@tablename+
'
where
'
+@strwhere+
'
order by
'
+@orderfield+
'
desc) order by
'
+@orderfield+
'
desc
''
;
'
end
else
begin
set
@sqlstr
=
@sqlstr
+
'
set @sqlstr=
''
select
'
+
@fieldlist
+
'
from ( select top
''
+cast(@nextpagenum as varchar)+
''
* from
'
+@tablename+
'
where
'
+@strwhere+
'
order by
'
+@orderfield+
'
asc )
as
a where
'
+@keyfield+
'
not
in
(
select top
''
+
cast(@curpagenum
as
varchar)
+
''
'
+@keyfield+
'
from
'
+@tablename+
'
where
'
+@strwhere+
'
order by
'
+@orderfield+
'
asc) order by
'
+@orderfield+
'
asc
''
;
'
end
set
@sqlstr
=
@sqlstr
+
'
execute( @sqlstr)
'
--
print @sqlstr
execute(@sqlstr)
------------------------------------------
目前最好的存储过程
----------------------------------------------------------------------
select getdate()
exec proc_pagination
'
ARTICLE
'
,
'
*
'
,
'
UpdateTime
'
,
20
,
1
,
0
,
1
,
''
select getdate()
CREATE PROCEDURE proc_pagination(
@tblName varchar(
255
),
--
表名
@strGetFields varchar(
1000
)
=
'
*
'
,
--
需要返回的列
@fldName varchar(
255
)
=
''
,
--
排序的字段名
@PageSize
int
=
10
,
--
页尺寸
@PageIndex
int
=
1
,
--
页码
@doCount bit
=
0
,
--
返回记录总数, 非
0
值则返回
@OrderType bit
=
0
,
--
设置排序类型, 非
0
值则降序
@strWhere varchar(
1500
)
=
''
--
查询条件 (注意: 不要加 where)
) AS
set
nocount on
declare @strSQL varchar(
5000
)
--
主语句
declare @strTmp varchar(
110
)
--
临时变量
declare @strOrder varchar(
400
)
--
排序类型
if
@doCount
!=
0
begin
if
@strWhere
!=
''
set
@strSQL
=
'
select count(*) as Total from [
'
+
@tblName
+
'
] where
'
+
@strWhere
else
set
@strSQL
=
'
select count(*) as Total from [
'
+
@tblName
+
'
]
'
end
--
以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况
else
begin
if
@OrderType
!=
0
begin
set
@strTmp
=
'
<(select min
'
set
@strOrder
=
'
order by [
'
+
@fldName
+
'
] desc
'
--
如果@OrderType不是0,就执行降序,这句很重要!
end
else
begin
set
@strTmp
=
'
>(select max
'
set
@strOrder
=
'
order by [
'
+
@fldName
+
'
] asc
'
end
if
@PageIndex
=
1
begin
if
@strWhere
!=
''
set
@strSQL
=
'
select top
'
+
str(@PageSize)
+
'
'
+
@strGetFields
+
'
from [
'
+
@tblName
+
'
] where
'
+
@strWhere
+
'
'
+
@strOrder
else
set
@strSQL
=
'
select top
'
+
str(@PageSize)
+
'
'
+
@strGetFields
+
'
from [
'
+
@tblName
+
'
]
'
+
@strOrder
--
如果是第一页就执行以上代码,这样会加快执行速度
end
else
begin
--
以下代码赋予了@strSQL以真正执行的SQL代码
set
@strSQL
=
'
select top
'
+
str(@PageSize)
+
'
'
+
@strGetFields
+
'
from [
'
+
@tblName
+
'
] where [
'
+
@fldName
+
'
]
'
+
@strTmp
+
'
([
'
+
@fldName
+
'
]) from (select top
'
+
str((@PageIndex
-
1
)
*
@PageSize)
+
'
[
'
+
@fldName
+
'
] from [
'
+
@tblName
+
'
]
'
+
@strOrder
+
'
) as tblTmp)
'
+
@strOrder
if
@strWhere
!=
''
set
@strSQL
=
'
select top
'
+
str(@PageSize)
+
'
'
+
@strGetFields
+
'
from [
'
+
@tblName
+
'
] where [
'
+
@fldName
+
'
]
'
+
@strTmp
+
'
([
'
+
@fldName
+
'
]) from (select top
'
+
str((@PageIndex
-
1
)
*
@PageSize)
+
'
[
'
+
@fldName
+
'
] from [
'
+
@tblName
+
'
] where
'
+
@strWhere
+
'
'
+
@strOrder
+
'
) as tblTmp) and
'
+
@strWhere
+
'
'
+
@strOrder
end
end
exec (@strSQL)
set
nocount off