简单的sql查询问题?

net205 2005-02-28 11:48:07
我这儿有个这样的情况:
表结构:
f_ID int 标识
f_Title nvarchar(200)
f_Type int 0表示置顶文章,1表示普通文章,2表示精华文章
f_RootID int 0表示是发表的文章,其他表示该文章是f_ID为f_RootID的回复文章
f_AddDT datetime

我要按条件(f_RooID=0)查询,把置顶的放在最前面,普通,精华的按日期排序就行了
select f_ID,f_Title,f_Type,f_RootID,f_AddDT,case f_Type when 0 then 0 else 1 end as TType from 表 where f_RootID=0 order by TType,f_AddDT desc
这一句sql可以达到这个要求。但我现在写了一个简单的分页存储过程,想用这个存储过程按上面的要求把记录列出来,就不知道怎么办?

存储过程是:

----------------------------------------------------------------------------------------
--存储过程名:SelRecordByPage
--说明:存储过程分页
--日期:
--返回值:
----------------------------------------------------------------------------------------
CREATE PROCEDURE DBO.SelRecordByPage
(
@tblName VARCHAR(255), --表名
@fldNames VARCHAR(255)='*', --要显示的字段列表
@PageSize INT=10, --每页显示的记录数
@curPage BIGINT=1, --当前页
@fldOrder VARCHAR(255), --关键字段
@strWhere varchar(2000) = '', --查询条件
@strOrder VARCHAR(255) --设置排序
)
AS

SET NOCOUNT ON
DECLARE @strSQL VARCHAR(6000)
DECLARE @strTmpSQL NVARCHAR(2000)
DECLARE @intTmpRecordNum INT
DECLARE @intTmpTotalPage INT

IF @strWhere=''
SET @strWhere='1=1'

IF @curPage<=1
BEGIN
SET @strSQL = 'SELECT Top '+cast(@PageSize as varchar(30))+' '+@fldNames+' FROM '+@tblName+' WHERE '+@strWhere+' '+@strOrder
END
ELSE
BEGIN

--把表中的记录总数返回给变量@intTmpRecordNum
SET @strTmpSQL = 'SELECT @intTmpRecordNum=COUNT(*) FROM '+@tblName+' WHERE '+@strWhere
Exec sp_executesql @strTmpSQL,N'@intTmpRecordNum int out',@intTmpRecordNum out

IF @intTmpRecordNum%@PageSize=0
SET @intTmpTotalPage = @intTmpRecordNum/@PageSize
ELSE
SET @intTmpTotalPage = @intTmpRecordNum/@PageSize+1

IF @curPage>@intTmpTotalPage
SET @curPage=@intTmpTotalPage

SET @strSQL='SELECT Top '+cast(@PageSize as varchar(30))+' '+@fldNames+' FROM '+@tblName+' WHERE '+@fldOrder+' NOT IN (SELECT TOP '+cast((@curPage-1)*@PageSize as varchar(30))+' '+@fldOrder+' FROM '+@tblName+' WHERE '+@strWhere+' '+@strOrder+') AND '+@strWhere+' '+@strOrder

END

--print @strSQL
Exec(@strSQL)
GO



---------------------------------------------
请大家帮忙,或者提提更好的办法,不知道我的问题说清楚没有.....
...全文
214 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
net205 2005-03-01
  • 打赏
  • 举报
回复
谢了。结帐
631799 2005-03-01
  • 打赏
  • 举报
回复
没有,你参数顺序要一一对应,有的话就无所谓了
net205 2005-03-01
  • 打赏
  • 举报
回复
那@tblName=N'表'前面的@tblName=又起什么作用呢???不用也行呀。。。。
net205 2005-02-28
  • 打赏
  • 举报
回复
没用的呀
zrtl 2005-02-28
  • 打赏
  • 举报
回复
SQL语句不用改,你在页面中再高一个待显示页码数值,每次查询得到结果集后把记录指针定位到待显示页的第一条记录所在的行。
yuesongboy 2005-02-28
  • 打赏
  • 举报
回复
把@strSql里面改一下
net205 2005-02-28
  • 打赏
  • 举报
回复
没人理我。。。。顶。。
占个沙发。。。。。
Softlee81307 2005-02-28
  • 打赏
  • 举报
回复
加N是nvarchar 数据类型
Softlee81307 2005-02-28
  • 打赏
  • 举报
回复
Yes,對了
net205 2005-02-28
  • 打赏
  • 举报
回复
顶一下。。。
net205 2005-02-28
  • 打赏
  • 举报
回复
顺便问一下:
@tblName=N'表'是什么意思,我直接用'表'也行呀。。。。
加个N是不是以nvarchar类型把值传过去???
这个@tblName在这儿有什么意义呢????

--------------------
sql帮助里查到的:[N]'tsql_string'

是一个常量,tsql_string 可以是 nvarchar 或 varchar 数据类型。如果包含 N,则该字符串将解释为 nvarchar 数据类型,最大值为服务器的可用内存。
kinglh 2005-02-28
  • 打赏
  • 举报
回复
老大一出手,问题不见了!
NET205碰上好人了!
net205 2005-02-28
  • 打赏
  • 举报
回复
case f_Type when 0 then 0 else 1 end
-------排序里也用这个,怎么我就是没想到呢。。。。

老大就是老大。。。。谢谢了,,好人。。。。

zjcxc 元老 2005-02-28
  • 打赏
  • 举报
回复
--那改成这样吧
exec DBO.SelRecordByPage
@tblName=N'表',
@fldNames=N'f_ID,f_Title,f_Type,f_RootID,f_AddDT,case f_Type when 0 then 0 else 1 end as TType',
@fldOrderVARCHAR=N'f_ID',
@strWhere=N'f_RootID=0',
@strOrder=N'case f_Type when 0 then 0 else 1 end,f_AddDT desc'

net205 2005-02-28
  • 打赏
  • 举报
回复
你上面给的调用没有错,但由于排序的问题,在存储过程里有一个not in (...),在这儿加上了排序,所以就出错:
SET @strSQL='SELECT Top '+cast(@PageSize as varchar(30))+' '+@fldNames+' FROM '+@tblName+' WHERE '+@fldOrder+' NOT IN (SELECT TOP '+cast((@curPage-1)*@PageSize as varchar(30))+' '+@fldOrder+' FROM '+@tblName+' WHERE '+@strWhere+' '+@strOrder+') AND '+@strWhere+' '+@strOrder

这一句接受参数后会成这样 ....NOT IN (select top 10 f_ID from ....order by TType,f_AddDT desc).....
这个括号里面,由于这个表没有TType字段,而order by 要按这个排序,所以出错
zjcxc 元老 2005-02-28
  • 打赏
  • 举报
回复
给数据出来测试一下,应该是那样直接调用没错了.
zjcxc 元老 2005-02-28
  • 打赏
  • 举报
回复
--你的表是用f_ID做标识字段,应该不会重复,因此你可以这样调用

exec DBO.SelRecordByPage
@tblName=N'表',
@fldNames=N'f_ID,f_Title,f_Type,f_RootID,f_AddDT,case f_Type when 0 then 0 else 1 end as TType',
@fldOrderVARCHAR=N'f_ID',
@strWhere=N'f_RootID=0',
@strOrder=N'TType,f_AddDT desc'
net205 2005-02-28
  • 打赏
  • 举报
回复
f_ID是主键,那存储过程是这样调用的:
SelRecordByPage '表','f_ID,f_Title,f_Type,f_RootID,f_AddDT',@MaxPerPage,@Page,'f_ID','f_RootID=0','ORDER By f_Type,f_AddDT DESC'
但这样做没有符合这个要求:置顶的放在最前面,普通,精华的按日期排序就行了

所以我不知道该怎么办




zjcxc 元老 2005-02-28
  • 打赏
  • 举报
回复
你的分页存储过程要求表中有主键,你的查询语句中那个字段可以做主键?

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧