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

クエリの最初のグループ ( queryForSpeed1and queryToUpdateDistanceBasedOnSpeed1) を 2 番目のグループとは別に実行すると、期待どおりの出力が得られます。 列speed1distance列のみにデータが含まれます。

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

2 番目のグループを実行すると、同じことが起こります。

___________________________________
| 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_speed_profile。2回目のパススルーで#temp_speed_profileは、6つのレコードすべてが取得されます。Voyage_Idの最初のレコードでSpeed_newがnullであるため、@distanceがnullになります。次のターンで@distanceの値を保持すると、nullのままになります。

2番目のパスは2番目のデータセットでのみ機能するため、異なる一時テーブルを使用すると問題が解決します。

カーソルに関する注意-カーソルを定義するときは、必ずlocalとfast_forwardを追加してください。カーソルのスコープを制限しているためローカルであり、フェッチを最適化するためにfast_forwardです。

于 2012-06-01T22:18:15.343 に答える
1

ほとんどの場合、クエリの書き方が原因です。

確認するには、単一の table ではなく、#temp_data1andを使用してクエリを書き直してください。#temp_data2#temp_data

于 2012-06-01T13:50:06.720 に答える