Temp Table无法在Cursor内部工作以存储数据

时间:2015-06-05 17:55:44

标签: sql-server

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

使用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 aaa       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

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

预期表

TranId  CustomerId CustomerName
  4        11         aaa
  5       22         bbb

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

在这里使用光标只是错误的方法。您不需要另一份数据副本,它已经在您的表变量中。您只需要一个查询来获取所需的行。你需要停止考虑循环所有事情。 :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