【问题标题】:Transaction management and temporary tables in SQL ServerSQL Server 中的事务管理和临时表
【发布时间】:2012-06-01 13:35:24
【问题描述】:

抱歉标题,可能不是很清楚。

我在脚本中有一些相互依赖的 SQL 查询。
该脚本使用插入数据的临时表(#temp_data 表)。

这是预期的输出

___________________________________
| speed1 |  speed2   |  distance   |  
|   1    |   NULL    |     10      |  
|   3    |   NULL    |     40      |
|   5    |   NULL    |     90      |
|  NULL  |    1      |     10      |
|  NULL  |    3      |     40      |
|  NULL  |    5      |     90      |

这是查询结构(我没有包含实际的查询,因为它太大了):

-- First group
queryForSpeed1
queryToUpdateDistanceBasedOnSpeed1

-- Second group 
queryForSpeed2
queryToUpdateDistanceBasedOnSpeed2

如果我将第一组查询(queryForSpeed1queryToUpdateDistanceBasedOnSpeed1)与第二组分开运行,那么我会得到预期的输出:只有 speed1distance 列包含数据:

___________________________________
| speed1 |  speed2   |  distance   |  
|   1    |   NULL    |     10      |  
|   3    |   NULL    |     40      |
|   5    |   NULL    |     90      |
|  NULL  |   NULL    |    NULL     |
|  NULL  |   NULL    |    NULL     |
|  NULL  |   NULL    |    NULL     |

当我运行第二组时也会发生同样的情况:

___________________________________
| speed1 |  speed2   |  distance   |  
|  NULL  |   NULL    |    NULL     |  
|  NULL  |   NULL    |    NULL     |
|  NULL  |   NULL    |    NULL     |
|  NULL  |    1      |     10      |
|  NULL  |    2      |     40      |
|  NULL  |    3      |     90      |

但是,当我运行两组时:所有距离都是NULL

___________________________________
| speed1 |  speed2   |  distance   |  
|   1    |   NULL    |    NULL     |  
|   3    |   NULL    |    NULL     |
|   5    |   NULL    |    NULL     |
|  NULL  |    1      |    NULL     |
|  NULL  |    2      |    NULL     |
|  NULL  |    3      |    NULL     |

我相信这在某种程度上与事务管理和临时表有关,尽管我无法在 Google 上找到解决问题的相关内容。

根据我的阅读,SQL Server 会保留一个事务日志,其中存储每个更新、插入和其他内容...当它到达脚本末尾时,它实际上会执行所有这些插入和更新。

因此,我对距离列所做的更新发现所有速度都为 NULL,因为数据尚未从先前的更新中插入到临时表中,但在查询结束时,速度已插入表中所以这就是它们可见的原因。

我玩了一下 GO statement 来批量执行我的脚本,但到目前为止没有运气......


我做错了什么?请有人指出我正确的方向吗?


编辑

这里是actual query

【问题讨论】:

  • 如果我们不知道您在做什么,我们无法回答您做错了什么
  • 我不认为这是交易。我认为这是您的查询。如果要归咎于交易,您可能甚至没有 speed1speed2 中的值(尽管这取决于您的查询,所以我们仍然需要查看它们)
  • 我把查询放在问题的最后...

标签: sql sql-server tsql transactions


【解决方案1】:

问题与事务无关,而与您对#temp_speed_profile 进行更新的方式有关。第二次通过#temp_speed_profile 检索所有六条记录。 Voyage_Id 的第一条记录中的 Speed_new 为空,因此 @distance 变为空。当您在下一回合保留@distance 的值时,它仍然为空。

使用不同的临时表时问题消失了,因为第二遍仅适用于第二组数据。

关于游标的说明 - 定义游标时,请确保添加本地和 fast_forward。本地,因为它限制了游标的范围,并且 fast_forward 用于优化提取。

【讨论】:

    【解决方案2】:

    这几乎肯定是由您编写查询的方式引起的。

    要确认,只需使用#temp_data1#temp_data2 重写您的查询,而不是使用单个表#temp_data

    【讨论】:

    • 我尝试按照您的建议使用 2 个表,它有效...我不想为此使用 2 个表,因为来自两个查询的数据是相关的并且它 应该在同一张桌子上......但无论如何,谢谢你的解决方案:)
    • 我不建议使用两个表。我建议弄清楚为什么两个表会使问题消失,然后解决问题。
    • 这就是我一直在尝试的,但没有找到任何解决方案。发生这种情况的原因是在查询运行后没有立即插入速度,因此距离使用为 NULL 的速度,因此很明显它本身变成了 NULL。在脚本的末尾插入了速度,因此它们是可见的......
    猜你喜欢
    • 2011-02-14
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多