首页 新闻 会员 周边 捐助

一个 简单的存储过程我找不到错误在哪

0
悬赏园豆:5 [已解决问题] 解决于 2011-02-18 12:00

 

存储过程

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go


-- =============================================
--
Author: 小黑
--
Create date: 2011-2-17
--
Description: 根据ID获取上一页下一页的存储过程
--
=============================================
ALTER PROCEDURE [dbo].[proc_PrevorNextpro]
@proid int,--表id
@str nvarchar(20),--prev 则是上一件 next则是下一件
@tblName nvarchar(20)--表名
AS
BEGIN
declare @rowid int
select @rowid=rowid from(
select ROW_NUMBER() over (order by createdate desc) as rowid,* from @tblName )as a where a.id=@proid
if @str='prev'
set @rowid=@rowid-1
else
set @rowid=@rowid+1

select * from(
select ROW_NUMBER() over (order by createdate desc) as rowid,* from @tblName )as a where a.rowid=@rowid
END

 

 

总是提示消息

 1087,级别 15,状态 2,过程 proc_PrevorNextpro,第 16 行
必须声明表变量 "@tblName"。
消息 1087,级别 15,状态 2,过程 proc_PrevorNextpro,第 24 行
必须声明表变量 "@tblName"。

卢青松的主页 卢青松 | 初学一级 | 园豆:126
提问于:2011-02-17 20:30
< >
分享
最佳答案
0

from后的表名或视图名不可以为变量。

你得把要执行的语句拼成一个字符串 (如@strsql),再用EXEC(@strsql)

这里有一个存储过程分页的例子,可以参考:

http://www.cnblogs.com/downmoon/archive/2011/02/10/1950789.html

收获园豆:2
邀月 | 高人七级 |园豆:25475 | 2011-02-18 09:17
太感谢你了
卢青松 | 园豆:126 (初学一级) | 2011-02-18 11:59
其他回答(2)
0
ALTER PROCEDURE [dbo].[proc_PrevorNextpro]
@proid int,--表id
@str nvarchar(20),--prev 则是上一件 next则是下一件
@tblName nvarchar(20)--表名
AS
BEGIN
DECLARE @strSQL VARCHAR(8000)
declare @rowid int
SET @strSQL='select '+ @rowid +'=rowid from(
select ROW_NUMBER() over (order by createdate desc) as rowid,* from
'+@tblName+' )as a where a.id=' + @proid
+ 'if ' + @str + '=' + char(39) + 'prev' + char(39)
+' set ' + @rowid + '=' +@rowid+'-1'
+' else '
+' set ' + @rowid + '=' + @rowid + '+1'
+'select * from(select ROW_NUMBER() over (order by createdate desc) as rowid,* from @tblName )as a where a.rowid=' + @rowid
END
EXEC(@strSQL)
收获园豆:2
彭汉生 | 园豆:1233 (小虾三级) | 2011-02-18 10:09
感谢
支持(0) 反对(0) 卢青松 | 园豆:126 (初学一级) | 2011-02-18 11:58
0

select ROW_NUMBER() over (order by createdate desc) as rowid,* from @tblName

这样是不对的。表名称是不可以为变量的。

你应该是用拼接sql的方式来完成你的逻辑。 楼上很全了

收获园豆:1
邢少 | 园豆:10926 (专家六级) | 2011-02-18 11:56
感谢
支持(0) 反对(0) 卢青松 | 园豆:126 (初学一级) | 2011-02-18 11:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册