在线等 临时表的问题

colacoca 2005-08-04 09:01:20
--表a数据量很大,所以需要根据where后条件(这里条件省略)创建一个临时表#temp限制a的大小
--后面还要用#temp做表链接.但若这样写的话,提示 服务器: 消息 208,级别 16,状态 1, 对象名 '#temp' 无效。
--请问 : 是不是不能用这种写法?还有一种是用游标的方法,但我不知道怎么写.现在我是创建了一个表,暂时能返回数据,但领导说这样容易出错,一定不能创建表,只能用临时或游标的...请教大家!!
declare @sqll varchar(1000)
select @sqll='select * into #temp from a where 1=1 '
exec @sqll
...全文
229 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
xn000 2005-08-15
  • 打赏
  • 举报
回复
遇见,相同问题。

谢谢。几位。。哈哈。
gimy007 2005-08-04
  • 打赏
  • 举报
回复
临时表是有时效的,你这样
declare @sqll varchar(1000)
select @sqll='select * into #temp from a where 1=1 '
exec @sqll
当然不行啦;
比如 exec 'create table #t(a int)'
当你执行完#t1,也就把#t删除了
colacoca 2005-08-04
  • 打赏
  • 举报
回复
exec内创建的临时表只在exec内部有效。

--就是,而且在同一个session,即使你:
If OBJECT_ID('tempdb..#Result') Is not Null
Begin
Drop Table #Result
End
也是不能再创建这个temp table,因为不容许,系统会认为存在,但是你看不见,也不能用!所以要重复使用一个temp table,就要考量到底是否值得你用复杂语法达到!你要往temp table插入,那么只是要秀一些数据给用户看吧?!
---------
主要是这个表中数据在后面要和好几个表做链接,所以想用到.
那么如果用游标,应该怎么实现呢.因为初接触这方面的东西,所以都不太懂.目前基本都实现了,不过我用一张表,下次查询时删除表,重新插进去,这样如果查询的人多了,容易出错,而且也不容许在数据库中随意这么做的.唉.....
goneaway 2005-08-04
  • 打赏
  • 举报
回复
这么麻烦干吗。
用全局临时表##,就好了
MorningTea 2005-08-04
  • 打赏
  • 举报
回复
回复人: colacoca(我是一瓶倒过来的可口可乐) ( ) 信誉:100 2005-08-04 10:08:00 得分: 0


select * into #temp from a where 1>2
declare @sqll varchar(1000)
select @sqll='insert into #temp select * from a where 1=1 '
exec @sqll
--在外部创建#temp,然后内部进行插入。

---------------------------
select * into #temp from a where 1>2,这里where 1>2是什么意思呢?

因为1不可能大于2,所以这样相当于建立一个表和a的结构一样,并且数据不导入
如果你用select * into #temp from a ,那么创建表的同时,还导入数据,自己测试看看!

如果不用EXEC,那要怎么实现?--这样在外部创建的临时表,在exec可以操作,就是
select @sqll='insert into #temp select * from a where 1=1 '
exec @sqll---这里写的很清楚丫


MorningTea 2005-08-04
  • 打赏
  • 举报
回复
回复人: vivianfdlpw() ( ) 信誉:100 2005-08-04 09:53:00 得分: 0


exec内创建的临时表只在exec内部有效。

--就是,而且在同一个session,即使你:
If OBJECT_ID('tempdb..#Result') Is not Null
Begin
Drop Table #Result
End
也是不能再创建这个temp table,因为不容许,系统会认为存在,但是你看不见,也不能用!所以要重复使用一个temp table,就要考量到底是否值得你用复杂语法达到!你要往temp table插入,那么只是要秀一些数据给用户看吧?!
colacoca 2005-08-04
  • 打赏
  • 举报
回复
select * into #temp from a where 1>2
declare @sqll varchar(1000)
select @sqll='insert into #temp select * from a where 1=1 '
exec @sqll
--在外部创建#temp,然后内部进行插入。

---------------------------
select * into #temp from a where 1>2,这里where 1>2是什么意思呢?

如果不用EXEC,那要怎么实现?
colacoca 2005-08-04
  • 打赏
  • 举报
回复
具体想实现什么效果?如果不太复杂的话,别用exec @sql1 这种语句做。
-------
效果就是以几个外面传进参数值为条件,在一张表中查出数据,再与另外几张表链接得出最后结果.
有点复杂,要用到好几个表,目前我们单位用的都是EXEC @Sql这种格式.
vivianfdlpw 2005-08-04
  • 打赏
  • 举报
回复
exec内创建的临时表只在exec内部有效。
rivery 2005-08-04
  • 打赏
  • 举报
回复
select * into #temp from a where 1>2
declare @sqll varchar(1000)
select @sqll='insert into #temp select * from a where 1=1 '
exec @sqll
--在外部创建#temp,然后内部进行插入。
wgqqgw 2005-08-04
  • 打赏
  • 举报
回复
具体想实现什么效果?如果不太复杂的话,别用exec @sql1 这种语句做。
colacoca 2005-08-04
  • 打赏
  • 举报
回复
我用的是SQL 2000
colacoca 2005-08-04
  • 打赏
  • 举报
回复
如果没有@Sqll的话,select * into #temp from a where 1=1.这样,select * from #temp就可以看到内容了.不知道为什么,在@Sqll里就不行了.
ghostzxp 2005-08-04
  • 打赏
  • 举报
回复
If OBJECT_ID('tempdb..#Result') Is not Null
Begin
Drop Table #Result
End
Create Table #Result
(
Item1 int,
Item2 decimal(10,2),
Item3 decimal(10,2)
)

你最好不要用exec

你是怎么创建临时表的?
colacoca 2005-08-04
  • 打赏
  • 举报
回复
感谢大家.结贴啦
colacoca 2005-08-04
  • 打赏
  • 举报
回复
回复人: QQMagicer() ( ) 信誉:100

干吗不把所有的语句写到一个@Sql里完成,包括update,insert,就像在存储过程里的一样,
最后exec (@sql),不就行了

----------------
采用的你的建议,已经解决了,本来我打算建临时表,再将数据写入.
colacoca 2005-08-04
  • 打赏
  • 举报
回复
就是在存储过程里面写的.不过要执行2次,所以才有这个问题
QQMagicer 2005-08-04
  • 打赏
  • 举报
回复
干吗不把所有的语句写到一个@Sql里完成,包括update,insert,就像在存储过程里的一样,
最后exec (@sql),不就行了
MorningTea 2005-08-04
  • 打赏
  • 举报
回复
---------
主要是这个表中数据在后面要和好几个表做链接,所以想用到.
那么如果用游标,应该怎么实现呢.因为初接触这方面的东西,所以都不太懂.目前基本都实现了,不过我用一张表,下次查询时删除表,重新插进去,这样如果查询的人多了,容易出错,而且也不容许在数据库中随意这么做的.唉.....

~~~~~~~~><~~~~~~~~~
那就写成存储过程,那么多个用户调用,各自产生的临时表同名但是没有并发问题,互不影响,你只要写一套代码!

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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