我用了如下存储过程,出现排序问题我在在表中加了一个排序字段 upfile ,int 类型,
现在sql排序是这样的 orderby upfile desc ,id desc在第一页,,出现的记录,,在翻到第二页也会出现,怎么回事存储过程如下 CREATE proc sp_PublicTurnPage(
@TBName nvarchar(2000)='',--表名,如 pinyin
@PageSize int=10,--每页的记录数,默认为 10
@CurPage int=1,--表示当前页 1@RowCount int =0 Output,--表示当前页 1@KeyField nvarchar(200)='ID',--关键字段名,默认为 ID,该字段要求是表中的索引 或 无重复和不为空的字段
@KeyAscDesc nvarchar(4)='',--关键字的升、降序,默认为升序 ASC , 降序为 DESC
@Fields nvarchar(2000)='ID',--所选择的列名,默认为全选
@Condition nvarchar(3000)='',--where 条件,默认为空
@OrderBy nvarchar(200)=''--排序条件,默认为空)asif @TBName = ''
begin
raiserror('请指定表名!',11,1)
return
endif @PageSize <=0 or @CurPage <0
begin
raiserror('当前页数和每页的记录数都必须大于零!',11,1)
return
end
if @KeyAscDesc = 'DESC'
set @KeyAscDesc = '<'
else
set @KeyAscDesc = '>'
if @Condition <> ''
set @Condition = ' where ' + @Condition
declare @SQL nvarchar(2000)
declare @SQL2 nvarchar(2000)
set @SQL = ''
if @CurPage = 1
set @SQL = @SQL + 'SELECT Top ' + ' ' + cast(@PageSize as nvarchar(20)) + ' ' + @Fields + ' ' + ' FROM ' + ' ' + @TBName + ' ' + @Condition + ' ' + @OrderByelse
begin
declare @iTopNum int
set @iTopNum = @PageSize * (@CurPage - 1)
set @SQL = @SQL + 'declare @sLastValue nvarchar(100)' + char(13)
set @SQL = @SQL + 'SELECT Top ' + cast(@iTopNum as nvarchar(20)) + ' @sLastValue=' + @KeyField + ' FROM ' + @TBName + @Condition + ' ' + @OrderBy+ char(13)declare @Condition2 nvarchar(200)
if @Condition = ''
set @Condition2 = ' where ' + @KeyField + @KeyAscDesc + '@sLastValue '
else
set @Condition2 = ' and ' + @KeyField + @KeyAscDesc + '@sLastValue '
set @SQL = @SQL + 'SELECT Top ' + cast(@PageSize as nvarchar(20)) + ' ' + @Fields + ' FROM ' + @TBName + @Condition +
@Condition2 + @OrderBy
end
declare @RowCount2 nvarchar (300)set @RowCount2 ='SELECT @RowCount= COUNT (ID) From ' + @TBName + @Condition EXECUTE sp_executesql @RowCount2,N'@RowCount int out',@RowCount outEXECUTE sp_executesql @SQL
GO
已上网 取消 普通链接 歌谷搜索 / 13 2007-02-28 修改 删除
已上网 取消 普通链接 百度搜索 / 12 2007-02-28 修改 删除
已上网 取消 普通链接 网易搜索 / 11 2007-03-05 修改 删除
已上网 取消 普通链接 天网搜索 / 10 2007-03-05 修改 删除
已上网 取消 普通链接 雅虎搜索 / 9 2007-03-05 修改 删除
已上网 取消 普通链接 搜搜网 / 7 2007-03-05 修改 删除
已上网 取消 合作网站 白领创业项目加盟网 / 4 2007-04-11 修改 删除
已上网 取消 普通链接 搜狗网 / 3
在第二页同样会出现以上记录,,然后才是不重复的记录现在应该如何改成,,加了排序字段存储过程就不能用了吗
现在sql排序是这样的 orderby upfile desc ,id desc在第一页,,出现的记录,,在翻到第二页也会出现,怎么回事存储过程如下 CREATE proc sp_PublicTurnPage(
@TBName nvarchar(2000)='',--表名,如 pinyin
@PageSize int=10,--每页的记录数,默认为 10
@CurPage int=1,--表示当前页 1@RowCount int =0 Output,--表示当前页 1@KeyField nvarchar(200)='ID',--关键字段名,默认为 ID,该字段要求是表中的索引 或 无重复和不为空的字段
@KeyAscDesc nvarchar(4)='',--关键字的升、降序,默认为升序 ASC , 降序为 DESC
@Fields nvarchar(2000)='ID',--所选择的列名,默认为全选
@Condition nvarchar(3000)='',--where 条件,默认为空
@OrderBy nvarchar(200)=''--排序条件,默认为空)asif @TBName = ''
begin
raiserror('请指定表名!',11,1)
return
endif @PageSize <=0 or @CurPage <0
begin
raiserror('当前页数和每页的记录数都必须大于零!',11,1)
return
end
if @KeyAscDesc = 'DESC'
set @KeyAscDesc = '<'
else
set @KeyAscDesc = '>'
if @Condition <> ''
set @Condition = ' where ' + @Condition
declare @SQL nvarchar(2000)
declare @SQL2 nvarchar(2000)
set @SQL = ''
if @CurPage = 1
set @SQL = @SQL + 'SELECT Top ' + ' ' + cast(@PageSize as nvarchar(20)) + ' ' + @Fields + ' ' + ' FROM ' + ' ' + @TBName + ' ' + @Condition + ' ' + @OrderByelse
begin
declare @iTopNum int
set @iTopNum = @PageSize * (@CurPage - 1)
set @SQL = @SQL + 'declare @sLastValue nvarchar(100)' + char(13)
set @SQL = @SQL + 'SELECT Top ' + cast(@iTopNum as nvarchar(20)) + ' @sLastValue=' + @KeyField + ' FROM ' + @TBName + @Condition + ' ' + @OrderBy+ char(13)declare @Condition2 nvarchar(200)
if @Condition = ''
set @Condition2 = ' where ' + @KeyField + @KeyAscDesc + '@sLastValue '
else
set @Condition2 = ' and ' + @KeyField + @KeyAscDesc + '@sLastValue '
set @SQL = @SQL + 'SELECT Top ' + cast(@PageSize as nvarchar(20)) + ' ' + @Fields + ' FROM ' + @TBName + @Condition +
@Condition2 + @OrderBy
end
declare @RowCount2 nvarchar (300)set @RowCount2 ='SELECT @RowCount= COUNT (ID) From ' + @TBName + @Condition EXECUTE sp_executesql @RowCount2,N'@RowCount int out',@RowCount outEXECUTE sp_executesql @SQL
GO
已上网 取消 普通链接 歌谷搜索 / 13 2007-02-28 修改 删除
已上网 取消 普通链接 百度搜索 / 12 2007-02-28 修改 删除
已上网 取消 普通链接 网易搜索 / 11 2007-03-05 修改 删除
已上网 取消 普通链接 天网搜索 / 10 2007-03-05 修改 删除
已上网 取消 普通链接 雅虎搜索 / 9 2007-03-05 修改 删除
已上网 取消 普通链接 搜搜网 / 7 2007-03-05 修改 删除
已上网 取消 合作网站 白领创业项目加盟网 / 4 2007-04-11 修改 删除
已上网 取消 普通链接 搜狗网 / 3
在第二页同样会出现以上记录,,然后才是不重复的记录现在应该如何改成,,加了排序字段存储过程就不能用了吗
(
@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
/**//*
名称:GetPagingRecord
作用:按任意字段进行排序分页
作者:菩提树(MARK MA)
时间:2004-12-14
声明:此代码你可以无偿使用及转载,但在转载时,请勿移称本文字声明
*/
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 @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 paymoney 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 paymoney asc) as a order by '+@orderfield+' asc '';'
end
set @sqlstr=@sqlstr+'if @Rcount>0 begin execute(@sqlstr) end'
--print @sqlstr
execute(@sqlstr)
先在查询分析器里面运行下看看EXEC sp_PublicTurnPage 表名, 10, 1
2。
强烈建议用户储存过程不要以 sp 开头, 会被sql引擎当作系统存储过程优先搜索, 导致不可预期的错误
这句有什么用啊
能够执行的
报错
过程 'GetPagingData' 需要参数 '@keyfield',但未提供该参数。