【问题标题】:Foreach, Cursor or something else?Foreach、Cursor 还是别的什么?
【发布时间】:2011-12-20 01:03:49
【问题描述】:

我正在从一个从 SQL 函数生成数据的查询中创建一个临时表。我想使用这个临时表为临时表中的每一行数据执行插入。进行此操作的最佳方法是什么?

#tmpTable 如下(为简单起见,未显示所有列):

EmpID       WorkHours      HourlyEquivalent     WeekOf
asmith      12             8.94                 12/5/2011
bjones      23.5           12.75                12/5/2011
criley      40             7.89                 12/5/2011

EmpHours 表中已经填入了员工的工时,但需要用他们的当量小时更新(根据上述函数计算)。我想为临时表中的每个员工执行更新,如下所示:

UPDATE EmpHours
SET HourlyEquivalent
WHERE WeekOf = #tmpTable.WeekOf
    AND EmpID = #tmpTable.EmpID

如果重要的话,我需要执行的更新次数少于 50。

【问题讨论】:

    标签: sql foreach cursor


    【解决方案1】:

    SQL 在单个命令中执行此类操作的效率要高得多,而不是逐行更新。即使在这种情况下您没有很多行,采用基于集合的方法而不是使用循环或游标仍然是一个好习惯。

    UPDATE e
    SET HourlyEquivalent = t.HourlyEquivalent
    FROM
        EmpHours e JOIN
        #tmpTable t ON t.WeekOf = e.WeekOf AND t.EmpID = e.EmpID
    

    【讨论】:

    • +1 - 始终建议避免使用 RBAR 技术(Row By Agonising Row)
    【解决方案2】:

    到另一个表中insert 的所有行#tmpTable,您可以一次完成所有操作。 假设两个表具有相同的结构,它会是这样的:

    insert into tablename
    select EmpID, WorkHours, HourlyEquivalent, WeekOf from #tmpTable
    

    正如迈克尔所说,更新是这样的:

    UPDATE e
    SET HourlyEquivalent = t.HourlyEquivalent
    FROM
        EmpHours e JOIN
        #tmpTable t ON t.WeekOf = e.WeekOf AND t.EmpID = e.EmpID
    

    【讨论】:

      猜你喜欢
      • 2015-03-04
      • 2011-10-03
      • 2016-12-30
      • 1970-01-01
      • 2016-12-13
      • 1970-01-01
      • 2018-12-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多