2

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

我在脚本中有一些相互依赖的 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 语句来批量执行我的脚本,但到目前为止还没有运气......


我究竟做错了什么?有人可以指出我正确的方向吗?


编辑

这是实际的查询

4

2 回答 2

1

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

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

于 2012-06-01T13:50:06.720 回答
1

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

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

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

于 2012-06-01T22:18:15.343 回答