临时表不能在游标内工作以存储数据

Posted

技术标签:

【中文标题】临时表不能在游标内工作以存储数据【英文标题】:Temp Table not working inside a Cursor to store data 【发布时间】:2015-06-05 17:55:44 【问题描述】:

这是我在存储过程中的光标

使用 Temp 表在光标内存储值

DECLARE cur CURSOR FOR SELECT * FROM @AutoDataType 
OPEN cur    
FETCH NEXT FROM cur INTO @Customer_Id,@First_Name
WHILE @@FETCH_STATUS = 0 
BEGIN       
 If(NOT(@Customer_Id IS NULL))
     BEGIN
       Select * into #Temp_Auto from [dbo].[Auto] WHERE Customer_Id=@Customer_Id
 END                
  FETCH NEXT FROM cur INTO @Customer_Id,@First_Name
END
CLOSE cur    
DEALLOCATE cur
Select * from #Temp_Auto

为什么我得到无效的对象名称#Temp_Auto? 如何将值放入 Temp 表并返回

这是我的父表:

 TranId   CustomerId CustomerName   Time_Stamp
    1          11        aaa        2015-06-05 17:39:00
    2          11        aaa        2015-06-05 17:45:00
    3          12        bbb        2015-06-05 17:45:00

@AutoDataType 包含 CustomerId

  CustomerID  CustomerName
     11          aaa
     12          bbb

我想要的是基于 id 的客户记录与 Time_Stamp DESC [最新条目]

预期表

TranId CustomerId CustomerName 2 11 天 3 22 bbb

请指导我

这是我的父表:

 TranId   CustomerId CustomerName   Time_Stamp
    1          11        aaa        2015-06-05 17:39:00
    2          11        aaa        2015-06-05 17:45:00
    3          12        bbb        2015-06-05 17:45:00
    4          11        aaa        2015-06-05 20:10:00
    5          12        bbb        2015-06-05 20:10:00

@AutoDataType 包含 CustomerId

  CustomerID  CustomerName
     11          aaa
     12          bbb

我想要的是根据 ID 获取客户记录,使用 Time_Stamp DESC [最新条目]

预期表

TranId  CustomerId CustomerName
  4        11         aaa
  5       22         bbb

只有 4 和 5 TranId,因为它们的 Time_Stamp 是最新的。

【问题讨论】:

你为什么在这里使用光标?你不是已经在你的表变量中有这个数据的副本吗???当然,如果您在 @AutoDataType 中有超过 1 行,这将崩溃,因为临时表已经存在。 那么我如何在条件下选择行并返回?请推荐我 您是否期望 1 行作为具有动态列数的输出?您是否还有其他细节忘记提及? 【参考方案1】:

在这里使用光标是错误的做法。您不需要数据的另一个副本,它已经在您的表变量中。您所需要的只是一个查询来获取您想要的行。您需要停止考虑为所有内容循环。 :D

select *
from
(
    SELECT a.CustomerID 
        , a.CustomerName
        , ROW_NUMBER() over (PARTITION BY CustomerID order by TIME_STAMP desc) as RowNum 
    FROM [dbo].[Auto] a
    JOIN @AutoDataType adt on adt.Customer_Id = a.Customer_Id
) x
where x.RowNum = 1
order by CustomerID

【讨论】:

请详细查找需求..请帮帮我 我添加了一些数据来解释它的属性。 我在此处发布的代码将完全符合您的要求。 非常感谢您的宝贵时间和帮助 好吧,我看不到您创建的查询,但我怀疑这是因为表和表变量中都存在列名。使用别名为列添加前缀,这应该可以解决问题。我几乎总是在我的查询中使用别名,但由于某种原因没有在这里...我应该有。【参考方案2】:

SELECT ... INTO 创建一个带有定义以匹配选择结果的表,然后插入到该表中,因此您只能对给定表执行一次。如果您真的想执行上述操作,则需要在循环外创建#Temp_Auto,然后将其插入而不是 SELECT ... INTO。

话虽如此,你为什么还要打扰光标呢?鉴于您的代码,它是完全没有必要的,并且与替代方案相比性能会很差。为什么不直接从 dbo.Auto 中选择 @AutoDataType 中具有 Customer_Id 的所有行并将它们插入到临时表中?

【讨论】:

以上是关于临时表不能在游标内工作以存储数据的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 存储过程,获取使用游标查询的结果集

oracle存储过程 中把临时表数据 返回结果集

Oracle 存储过程 - 创建游标后我可以清空临时表吗

mysql 在存储过程里的游标的表名能不能是变量啊?

mysql 存储过程中使用游标中使用临时表可以替代数组效果

mysql中怎么存储数组