SQL Server中的事务管理和临时表

时间:2012-06-01 13:35:25

标签: sql sql-server tsql transactions

对不起标题,也许不是很清楚。

我在脚本中有一些相互依赖的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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

问题与交易无关,而是与#temp_speed_profile的更新方式有关。第二次通过#temp_speed_profile检索所有六条记录。在Voyage_Id的第一个记录中,Speed_new为空,因此@distance变为null。当您在下一回合保留@distance的值时,它将保持为空。

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

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