一存储过程,正解即结贴

tiantian1980 2009-10-06 12:04:42
按aspnetpager写的一个存储过程分页,有表名作变量就报错。高手帮看看,正解即结贴:
没有表名做变量是的存储过程是这样的的
create procedure KF_pro_Conversations
(@startIndex int,
@endIndex int,
@user_name nvarchar(50)
)
as
set nocount on
declare @indextable table(id int identity(1,1),nid int)--临时表有两个字段,一个是id,还有一个是nid,用临时表解决主表id不安顺序增长
set rowcount @endIndex
insert into @indextable(nid) select msg_id from KF_1_MessageInfo where senderName=@user_name and msg_id in (select max(msg_id) from KF_1_MessageInfo group by ReceiverName,senderName)
select O.ReceiverName,b.notes_name
from KF_1_MessageInfo as O
left join KF_userlogin b on O.ReceiverName=b.loginuser_ip
inner join @indextable t on O.msg_id=t.nid
where t.id between @startIndex and @endIndex and senderName=@user_name and msg_id in (select max(msg_id) from KF_1_MessageInfo group by ReceiverName,senderName)


但要表名作变量:
create procedure KF_pro_Conversations
(@startIndex int,
@endIndex int,
@user_name nvarchar(50),
@Tablename nvarchar(50)
)
as
begin
set nocount on
declare @indextable table(id int identity(1,1),nid int)--临时表有两个字段,一个是id,还有一个是nid,用临时表解决主表id不安顺序增长
set rowcount @endIndex
declare @sql1 varchar(255)
declare @sql2 varchar(255)
select @sql1='insert into '+@indextable+'(nid) select msg_id from'+ @Tablename+' where senderName='+@user_name+' and msg_id in (select max(msg_id) from'+ @Tablename+' group by ReceiverName,senderName)'
exec(@sql1)
select @sql2 ='select O.ReceiverName,b.notes_name
from'+ @Tablename+' as O
left join KF_userlogin b on O.ReceiverName=b.loginuser_ip
inner join '+@indextable+' t on O.msg_id=t.nid
where t.id between '+@startIndex+' and '+@endIndex+' and senderName='+@user_name+' and msg_id in (select max(msg_id) from'+ @Tablename+' group by ReceiverName,senderName)'
exec(@sql2)
end

说必须声明变量 '@indextable'。
...全文
90 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
nosuchtracter 2009-10-06
  • 打赏
  • 举报
回复
你把声明临时表的语句也写在SQL语句里面把
所有的都可以写在SQL语句里面,最好EXEC(SQL)就可以了
但楼主既然用了临时表,还拼SQL语句做什么?

ALTER procedure [dbo].[proc_paged_with_notin] --利用select top and select not in
(
@pageIndex int, --页索引
@pageSize int --每页记录数
)
as
begin
set nocount on;
declare @timediff datetime --耗时
declare @sql nvarchar(500)
select @timediff=Getdate()
set @sql='select top '+str(@pageSize)+' * from tb_TestTable where(ID not in(select top '

+str(@pageSize*@pageIndex)+' id from tb_TestTable order by ID ASC)) order by ID'
execute(@sql) --因select top后不支技直接接参数,所以写成了字符串@sql
select datediff(ms,@timediff,GetDate()) as 耗时
set nocount off;
end

  • 打赏
  • 举报
回复
没太看懂。。呵呵。。
你声明的@indextable,这个临时表可以在存储过程里建一个吧,
就Create table #temp (id int identity(1,1),nid int),
然后用这个替代@indextable不行吗??
happy664618843 2009-10-06
  • 打赏
  • 举报
回复
顶顶
足球中国 2009-10-06
  • 打赏
  • 举报
回复
内存表对速度有很大的影响。不如用临时表。
tiantian1980 2009-10-06
  • 打赏
  • 举报
回复
wuyq11
-----------
按你上面的改了,把@indextable(nid)放入引号内以后还是不行,一样的问题说 必须声明变量 '@indextable'
wuyq11 2009-10-06
  • 打赏
  • 举报
回复
declare @indextable table(id int identity(1,1),nid int)
set rowcount endIndex
select @sql1='insert into @indextable(nid) select msg_id from '+ @Tablename+' where senderName='+@user_name+' and msg_id in (select max(msg_id) from'+ @Tablename+' group by ReceiverName,senderName)'
exec(@sql1)

62,025

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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