这是我的光标所在的存储过程
使用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是最新的。
答案 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