有关存储过程中使用动态SQL的疑问, 请大家赐教, 谢谢!
--declare @aa varchar(200)
--select @aa='select * from member'
--exec( @aa )
--keyword sp
drop proc sp_keyword_search;
go
create proc sp_keyword_search
@offset int,
@pagesize int=20, --默认每页20条记录
@whereclause varchar(200)='1=1', -- default condiction
@orderclause varchar(200)='b.LevelId desc, b.BusinessName asc' -- default condiction
as
set nocount on
if @offset<@pagesize
set @offset=0
declare @sql varchar(300)
if @offset=0
begin
set rowcount @pagesize
select @sql='select * from business as b where ' + @whereclause+' order by '+ @orderclause
exec (@sql)
end
else
begin
declare @i int
set @i=@offset+@pagesize
set rowcount @i
select @sql='select businessId into #t from business as b where ' + @whereclause+' order by '+ @orderclause
exec( @sql)
set @i=@offset
set rowcount @i
delete from #t
select * from business a
where exists(
select * from #t where businessId=a.businessid)
end
set rowcount 0
go
调用 exec prc_keyword_search @offset=100; 出错
错误信息:
服务器: 消息 208,级别 16,状态 1,行 1
对象名 '#t' 无效。
服务器: 消息 208,级别 16,状态 1,过程 prc_keyword_search,行 40
对象名 '#t' 无效。
是什么原因?难道SP中的动态SQL不可以使用临时表吗?
问题点数:0、回复次数:5Top
1 楼guanshiyu123(就欺负你..宝)回复于 2004-12-02 23:22:15 得分 0
临时表的这种情况我倒是不知道,
不过你的需求可以用物理表来完成啊,把#t换成一个物理表,例如ttt,用完了之后,判断ttt是否存在,存在就删除它,就可以了,只是代价大点,Top
2 楼gzchrishu(Chris)回复于 2004-12-02 23:37:56 得分 0
哦, 我写错了, 我调用的时候是执行:
exec sp_keyword_search @offset=100;
TO: guanshiyu123(老关)
我这个情况不能用物理表, 因为这是一个数据分页的SQL
Top
3 楼mastersky(浪)回复于 2004-12-03 00:02:52 得分 0
服务器: 消息 208,级别 16,状态 1,行 1
对象名 'business' 无效。
服务器: 消息 208,级别 16,状态 1,过程 sp_keyword_search,行 30
对象名 '#t' 无效。
Top
4 楼passionke(每一步都改变未来,却只能有一种结局!)回复于 2004-12-03 00:06:06 得分 0
先建立临时表,在用insert插入数据Top
5 楼gzchrishu(Chris)回复于 2004-12-03 15:57:41 得分 0
先建立临时表,在用insert插入数据
这样的话表的数据有可能给其他的用户访问的到,也不可行哦Top




