Sql server 临时表未在游标内工作以存储数据
这是存储过程中的游标 使用临时表在光标内存储值Sql server 临时表未在游标内工作以存储数据,sql-server,Sql Server,这是存储过程中的游标 使用临时表在光标内存储值 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_Aut
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\u Auto?
如何将值放入临时表并返回
这是我的父表:
@AutoDataType包含CustomerId
我想要的是根据id获取客户记录,该id带有时间戳DESC[最新条目]
期望表
TranId CustomerId CustomerName
2.11 aaa
3.22 bbb
请引导我
这是我的父表:
@AutoDataType包含CustomerId
我想要的是根据ID获取客户记录,该ID带有时间戳DESC[最新条目]
期望表
只有4和5个TranId,因为它们的时间戳是最新的。选择。。。INTO创建一个定义与select结果匹配的表,然后将其插入该表中,因此对于给定的表只能执行一次。如果你真的想做上面的事情,你需要在循环外创建Temp_Auto,然后插入到其中,而不是选择。。。进入
也就是说,你为什么还要麻烦光标呢?考虑到你的代码,它是完全不必要的,而且与其他替代方案相比,它的性能相当差。为什么不从dbo.Auto中选择所有在@AutoDataType中有Customer\u Id的行并将它们插入临时表中呢?在这里使用光标是错误的。您不需要数据的另一个副本,它已经在您的表变量中。您所需要的只是一个查询来获取所需的行。您需要停止考虑所有内容的循环: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
为什么在这里使用光标?您的表变量中是否已经有此数据作为副本???当然,如果@AutoDataType中有多行,这将崩溃,因为临时表已经存在。那么如何在条件中选择行并返回?请建议您是否期望1行作为输出,并具有动态的列数?您还有没有忘记提及的其他细节?请详细查找要求。。请帮助我我为expalin it属性添加了更多数据。我在此发布的代码将完全满足您的要求。非常感谢您的时间和帮助。我看不到您创建的查询,但我怀疑这是因为表和表变量中都存在列名。在列前面加上别名,这样可以解决问题。我几乎总是在我的查询中使用别名,但出于某种原因,我没有在这里使用…我应该使用。
CustomerID CustomerName
11 aaa
12 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
CustomerID CustomerName
11 aaa
12 bbb
TranId CustomerId CustomerName
4 11 aaa
5 22 bbb
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