首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

谁能帮小弟我改一存储过程,测试通过了50分全拿

2012-04-04 
哪位高手能帮我改一存储过程,测试通过了50分全拿这是一个通用的分页存储过程,其道理就是通过max和min函数

哪位高手能帮我改一存储过程,测试通过了50分全拿
这是一个通用的分页存储过程,其道理就是通过max和min函数来取数据,现只支持一个字段的排序,谁能帮我改成2个字段或多字段的排序

--   获取指定页的数据
CREATE   PROCEDURE   CS_SP_TS_Web_Pager
@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
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   + "],C_CALLTIME   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)
GO


[解决办法]
坐个沙发还有分啊?!
[解决办法]
这个要慕白兄、孟子E章、八戒、高歌等高手回答老~~
偶学习。
[解决办法]
你的@fldName 参数传多个值就可以了

比喻你想按名字,班级排序

name,class

你把上面当成一个串传进去
[解决办法]
楼主试一下把生成的SQL放在查询分析器中执行,或把生成的SQL贴出来,如果方便的话.
[解决办法]
ALTER procedure adminquestion //创建存储过程
(
@pagesize int, //分页大小
@pageindex int, //当前页数


@docount bit //true:返回数据量填充分页控件,false:返回数据填充数据显示控件
)
as
set nocount on
if(@docount=1) //返回数据量填充分页控件
SELECT count(questionid) FROM question
else
begin
declare @indextable table(questionid int identity(1,1),nid int) //定义虚拟表,包括int型的questonid字段初始值为1,自增1,已经int型的nid字段
declare @PageLowerBound int
declare @PageUpperBound int
set @PageLowerBound=(@pageindex-1)*@pagesize
set @PageUpperBound=@PageLowerBound+@pagesize
set rowcount @PageUpperBound //确定返回的数据量
insert into @indextable(nid) select questionid FROM question order by questionid desc //定义虚拟表

select O.NodeName,0.Score,O.total,O.state ,O.questionid,O.ptime ,case when len(title)> 30 then left(title,28)+ '... 'else title end as title from question O,@indextable t where O.questionid=t.nid
and t.questionid> @PageLowerBound and t.questionid <=@PageUpperBound order by t.questionid //查找数据,返回给应用程序
end
set nocount off

[解决办法]
多定义一个参数:测试通过。。
CREATE PROCEDURE GetRecordFromPage
@tblName varchar(255), -- 表名
@fldName varchar(255), -- 字段名
@fldName1 varchar(255), -- 字段名1
@PageSize int = 20, -- 页尺寸
@PageIndex int = 1, -- 页码
@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
@strWhere varchar(2000) = ' ' -- 查询条件 (注意: 不要加 where)
AS

declare @strSQL varchar(6000) -- 主语句
declare @strTmp varchar(1000) -- 临时变量
declare @strOrder varchar(500) -- 排序类型

if @OrderType != 0
begin
set @strTmp = ' <(select min '
set @strOrder = ' order by [ ' + @fldName1 + '] desc,[ ' + @fldName + '] desc '
end
else
begin
set @strTmp = '> (select max '
set @strOrder = ' order by [ ' + @fldName1 + '] asc,[ ' + @fldName + '] asc '
end

set @strSQL = 'select top ' + str(@PageSize) + ' * from [ '
+ @tblName + '] where [ ' + @fldName1 + '] ' + @strTmp + '([ '
+ @fldName1 + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' [ '
+ @fldName1 + '] from [ ' + @tblName + '] ' + @strOrder + ') as tblTmp) '
+ @strOrder

if @strWhere != ' '
set @strSQL = 'select top ' + str(@PageSize) + ' * from [ '
+ @tblName + '] where [ ' + @fldName + '] ' + @strTmp + '([ '
+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' [ '
+ @fldName + '] from [ ' + @tblName + '] where ' + @strWhere + ' '
+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder

if @PageIndex = 1
begin
set @strTmp = ' '
if @strWhere != ' '
set @strTmp = ' where ( ' + @strWhere + ') '

set @strSQL = 'select top ' + str(@PageSize) + ' * from [ '
+ @tblName + '] ' + @strTmp + ' ' + @strOrder
end

exec (@strSQL)


GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

热点排行