临时表不能在游标内工作以存储数据
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 的所有行并将它们插入到临时表中?
【讨论】:
以上是关于临时表不能在游标内工作以存储数据的主要内容,如果未能解决你的问题,请参考以下文章