存储过程
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"。
from后的表名或视图名不可以为变量。
你得把要执行的语句拼成一个字符串 (如@strsql),再用EXEC(@strsql)
这里有一个存储过程分页的例子,可以参考:
http://www.cnblogs.com/downmoon/archive/2011/02/10/1950789.html
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)
select ROW_NUMBER() over (order by createdate desc) as rowid,* from @tblName
这样是不对的。表名称是不可以为变量的。
你应该是用拼接sql的方式来完成你的逻辑。 楼上很全了