对不起标题,也许不是很清楚。
我在脚本中有一些相互依赖的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
如果我从第二组分别运行第一组查询(queryForSpeed1
和queryToUpdateDistanceBasedOnSpeed1
),那么我会得到预期的输出:只有speed1
和distance
列包含数据:
___________________________________
| 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。
答案 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来优化提取。