读书人

谁能帮小弟我改一存储过程测试通过了

发布时间: 2012-04-04 16:38:51 作者: rapoo

哪位高手能帮我改一存储过程,测试通过了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

读书人网 >asp.net

热点推荐