2009-07-21 18 views
1

[OK]を、以前私が持っていた問題に関する質問があります。私はそれを修正する方法を知っていますが、私たちはエラーを再現しようとするのに問題があります。Sybaseの変数選択ロジック

他のレコードに基づいてレコードを作成する一連の手順があります。レコードは、link_idによってプライマリレコードにリンクされています。このlink_idをつかむの手順では、クエリは、活動のためのテーブルの複数の行があり、今

select @p_link_id = id --of the parent 
from table 
where thingy_id = (blah) 

です。一部はキャンセルできます。私が持っているコードは、select文でキャンセルされた行をdisincludeしないので、以前にキャンセルされた行がある場合、それらのidがselectに表示されます。キャンセルされた行を取り消した場合、常に選択されている「開いた」レコードが1つあります。 (where status != 'C'を追加)

これはこの問題を解決します。しかし、開発環境で問題を再現できるようにする必要があります。

私はデータのヒープ全体を入力して開き、キャンセルなどして、このselect文を取得して無効なIDを返すようにしました。しかし、selectを実行するたびに、idが順番に(シーケンスが生成されます)、このエラーが発生した場合、selectステートメントは変数の最初の値を返すようになりました。

たとえば、上記の

ID Status 
1 Cancelled 
2 Cancelled 
3 Cancelled 
4 Open 

私は私がしたいIDのための選択をすれば、私が取得したい「4」。このエラーでは、結果は1です。ただし、キャンセルされたレコードを10個入力しても、選択の最後のレコードが残ります。

oracleでは、変数を選択して複数のレコードが返された場合、エラーが発生することがわかりました(私は思う)。 Sybaseは明らかにエラーを起こさずに変数に複数の値を割り当てることができます。

データがテーブルからどのように選択されているか、ソート順のないIDが昇順で返されない場合、または変数が変数に選択されるdboptionがあると考えていますクエリされた最初または最後の値を保存します。

編集:ストアドプロシージャの変更をロールバックしてこのエラーを再現できるようです。ただし、procsはこのlink_id列の近くにはありません。データベースアーキテクチャの変更によりインデックスなどが破損する可能性はありますか?

+0

これは[tag:sybase-asa]、[tag:sybase-ase]、[tag:sybase-iq]、または[tag:sqlanywhere]ですか? [sybase]タグをクリーンアップしようとしています... –

答えて

2

複数の行が返された場合、格納される値はthisに従ってリスト内のの最後のの値になります。

ORDER BYで取得する注文を指定していない場合、返される注文はデータベースエンジンの都合で返されます。これは、データベースインスタンスによって非常に異なる場合があります。データがデータベースブロック構造内に配置されるため、作成された順番になるか、「ランダム」に見えることさえあります。

話の教訓:

  1. 常に、#1を行うことができない場合はシングルトンSELECT sが単一の行
  2. を返すようにあなたが気に1が最後になることを確認するORDER BYを使用