怎么不能得到临时表中的一条记录?

TCat 2004-11-16 01:16:24

问题1:
在一个存储过程里有这样的语句

create table #InitQueryUser
(
Tempid int identity(1,1) ,
userid int,
amount int,
registeron datetime,
displayname nvarchar(20)
)

declare @rowUserId int

set @rowUserId = ( select userid from #InitQueryUser where Tempid = 1 )

这里执行的时候为什么会出现“列名 'Tempid' 无效。”呢?很是不解?

问题2:游标和临时表有什么区别呢?

...全文
109 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
y81920 2004-11-16
  • 打赏
  • 举报
回复
游标我觉得实质上也是一个临时表,只不过这个临时表功能上比普通的临时表强大,提供了对记录逐行处理的功能.
TCat 2004-11-16
  • 打赏
  • 举报
回复
to:lsxaa(小李铅笔刀) 确实没有问题,但是在刚才那个查询窗口中怎么都会出问题,在查询分析器里重建一个窗口就可以了:-)

非常感谢大家
mschen 2004-11-16
  • 打赏
  • 举报
回复
游标我觉得实质上也是一个临时表,只不过这个临时表功能上比普通的临时表强大,提供了对记录逐行处理的功能.
zjcxc 2004-11-16
  • 打赏
  • 举报
回复
--另外,对于这句
set @rowUserId = ( select userid from #InitQueryUser where Tempid = 1 )

--如果满足条件的有多个记录,则会报另一个错误,建议改为:
set @rowUserId = ( select top 1 userid from #InitQueryUser where Tempid = 1 )
--或:
select @rowUserId =userid from #InitQueryUser where Tempid = 1
zjcxc 2004-11-16
  • 打赏
  • 举报
回复
--解决的方法是用exec封装处理过程,解决示例如下

create table #InitQueryUser
(
-- Tempid int identity(1,1) ,
userid int,
amount int,
registeron datetime,
displayname nvarchar(20)
)

--用exec把添加列的过程封装起来
exec('alter table #InitQueryUser add Tempid int identity(1,1)')

declare @rowUserId int

set @rowUserId = ( select userid from #InitQueryUser where Tempid = 1 )

lsxaa 2004-11-16
  • 打赏
  • 举报
回复
是不是还有其他的语句啊 两种我都试了,没问题
zjcxc 2004-11-16
  • 打赏
  • 举报
回复
--对于第一个问题,估计楼主是做类似这样的处理,所以会报错

create table #InitQueryUser
(
-- Tempid int identity(1,1) ,
userid int,
amount int,
registeron datetime,
displayname nvarchar(20)
)

alter table #InitQueryUser add Tempid int identity(1,1)

declare @rowUserId int

set @rowUserId = ( select userid from #InitQueryUser where Tempid = 1 )

/*--测试结果

服务器: 消息 207,级别 16,状态 3,行 14
列名 'Tempid' 无效。
--*/
TCat 2004-11-16
  • 打赏
  • 举报
回复
很是感谢!
select @rowUserId = userid from #InitQueryUser where Tempid = 1

使用这个以后还是出现列名 'Tempid' 无效。

希望你能在机器里试试
zjcxc 2004-11-16
  • 打赏
  • 举报
回复
游标相当于前台程序设计时的 recordset 对象,可以逐条处理记录
zjcxc 2004-11-16
  • 打赏
  • 举报
回复
问题2

临时表和普通表差不多,只不过它是临时存在的,在它的生命周期结束后会自动删除
临时表有全局的临时表(表名以##开头)和局部的临时表(表名以#开头)
全局的临时表在SQL服务停止时自动删除
局部临时表在创建它的过程结束后自动删除
mschen 2004-11-16
  • 打赏
  • 举报
回复
游标可以对记录集进行逐行的处理,而临时表没有这样的能力.
zjcxc 2004-11-16
  • 打赏
  • 举报
回复
我测试了楼主的语句,是没有问题的

估计楼主是在创建了临时表后,再添加的 Tempid 列吧? 这样的话就会出现"列名 'Tempid' 无效。"的错误
lsxaa 2004-11-16
  • 打赏
  • 举报
回复
问题2 建议看看书
lsxaa 2004-11-16
  • 打赏
  • 举报
回复
select @rowUserId = userid from #InitQueryUser where Tempid = 1

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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