2009-07-21 122 views
1

好的,我有一個問題涉及到我以前遇到的問題。我知道如何解決這個問題,但是我們在嘗試重現錯誤時遇到了問題。Sybase選擇變量邏輯

我們有一系列基於其他記錄創建記錄的過程。記錄通過link_id鏈接到主記錄。在這抓住一個link_id程序,查詢

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

現在,有在表的活動多行。有些可以取消。我擁有的代碼並不會在select語句中排除已取消的行,因此如果先前已取消行,那些id將出現在select中。如果我拒絕已取消的行,總會有一個「開放」記錄被選中。 (追加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

請問這是[標籤:sybase-asa],[標籤:sybase-ase],[標籤:sybase-iq]還是[標籤:sqlanywhere]?試圖清理[sybase]標記... – 2013-03-14 07:31:05

回答

2

如果返回多於一行,則根據this,存儲的值將是列表中的最後一個值。

如果您還沒有通過ORDER BY指定檢索的訂單,那麼返回的訂單將在數據庫引擎的方便之處。它可能會因數據庫實例而異。它可能按照創建的順序,或者由於數據在數據庫塊結構中的放置位置而顯示爲「隨機」。

這個故事的寓意是:

  1. 總是讓單身SELECT迴歸單行
  2. 當#1無法做到的,使用ORDER BY,以確保您所關心的一個來最後一個