if exists(select * from sysobjects where name='GetAllNewsByPage' and type='p')
drop proc GetAllNewsByPage
go
CREATE proc GetAllNewsByPage
@title varchar(300),--要查询的标题
@pageviewcount int,--这个是页面显示的条数
@pagesize int, --这个当前页
@table varchar(80)--这个是表名
as
create table #tempNews --declare @tempNews table 这个不行 会出错 不能用变量
--是新表的名称。表名必须符合标识符规则。数据库中的 owner.table_name 组合必
--须唯一。table_name 最多可包含 128 个字符,但本地临时表的表名(名称前有一个编号符 #)最多
-- 只能包 含 116 个字符。
--局部临时表 #tempMoney 生存期除了存储过程就结束了
--全局临时表 ##tempMoney
(
tempID int identity,
newsid int
)
declare @maxRows int
declare @sql nvarchar(2000)
set @maxRows=@pageviewcount * @pagesize--这个可以显示到多少行
set ROWCOUNT @maxRows
set @sql='insert into #tempNews(newsid) select id from '+rtrim(@table)+' where title like ''%'+@title+'%'''+' order by
addtime desc'
exec (@sql)
set rowcount @pageviewcount
declare @ResultSql varchar(600)
set @ResultSql='select substring(n.content,1,295) as content, n.title,n.id,n.addtime,t.tempId from
#tempNews t inner join '+rtrim(@table)+' n on t.newsid=n.id where tempId>'+rtrim((@pagesize-1)*@pageviewcount)
exec (@ResultSql)
set rowcount 0
GO
原来自己研究了几天也没弄出来,表名不是变量的话就可以通过,一旦替换成变量就不行了,必须要exec(@sql)来执行了,因为from 子句只能带表名、视图名、表变量,编译器把@tablename 看作表变量,会报变量没有申明的错误。还有一个就是临时表那里,写成DECLARE @temp table 也会出问题,需要创建一个临时表create table #temp,不然在执行@sql中它还是把@temp 当变量。最后一个就是在sql语句中2个''表示一个'