如何根据表计数更新存储过程中的临时表

时间:2015-04-10 12:27:02

标签: sql-server-2008 stored-procedures

我的临时表(#temp_table_between_range)如下所示:

enter image description here

我试过了

 UPDATE #temp_table_between_range 
 SET ToDate = DateAdd(YEAR, 100, GetDate()) 
 WHERE ToDate = (SELECT MAX(ToDate) FROM #temp_table_between_range) 

但它没有修复最后一列的最后一行,它只更新了最大日期

我必须只更新最后一列的最后一行

2 个答案:

答案 0 :(得分:1)

为了更新表的“最后”行,您需要知道或决定如何订购记录。与某些数据库不同,SQL Server没有您可以引用的基础“物理行号”。

即使它确实如此,你也不能依赖于通过INSERT ... SELECTSELECT ... INTO语句(没有ORDER BY子句)每次都以相同的顺序到达时添加到表中的记录,甚至如果所有变量都相同,并且运行之间似乎没有任何变化。

因此,为了按照可靠的方式做你想做的事,你需要一些东西来排序。

让我们假设您想要按ToDate然后FromDate排序的示例。以下是UPDATE语句如何工作的示例:

 ;
 WITH  cte AS
 (
    SELECT   FromDate
       ,     ToDate
       ,     RecordNumber = ROW_NUMBER() 
               OVER (ORDER BY FromDate DESC, ToDate DESC)
    FROM    #temp_table_between_range 
 )
 UPDATE  cte
    SET  ToDate=DateAdd(YEAR, 100, GetDate()) 
 WHERE   cte.RecordNumber = 1

我假设FromDateToDate的组合在临时表中是唯一的,并且这些是临时表中的唯一列。如果您有其他列,因此可以通过某种方式告诉两个记录具有相同的FromDateToDate,您可能希望将它们添加到您的排序或WHERE子句中。

答案 1 :(得分:-1)

请创建一个带有标识列的临时表,您可以在其中控制记录编号,如下所示

Create Table #temp_table_between_range
(
   RecID INT Identity, 
   fromdate datetime,
   todate datetime
)

并使用以下更新

 declare @cnt int
 set @cnt=(select MAX(RecId) from #temp_table_between_range)
 update #temp_table_between_range 
 set ToDate=DateAdd(YEAR, 100, GetDate()) 
 where RecId=@cnt

如果这对您有用,请告诉我