2010-07-16 130 views
1

我有一種情況,我想要一個存儲過程返回一個表,它自己調用遞歸作爲其計算的一部分。在SQL Server中存儲過程遞歸

不幸的是SQL Server的是有沒有這一點,並給了我沿兩個暫時無法宣佈,已經存在,有關無法嵌套並插入exec語句遊標行錯誤。

我可以通過使用函數解決其中的一些問題嗎?有沒有更好的方法來做到這一點?

計算在本質上是遞歸的,所以沒有這種使用周圍的任何越來越加入,據我可以告訴。

編輯:澄清實際計算,因爲代碼是由其他的東西變得複雜,並且可能變得複雜就事論事

假設表A具有列(數據筒,OBJID,OBJTYPE,重量)和表B具有列(ITEMID ,價值)。

OBJTYPE表A告訴您是否OBJID表A是一個數據筒(再次在表A)或是與從ITEMID表B.

(數據筒,OBJID)是上表A中的主鍵是ITEMID上表B.

通常是一個容器將有數十至數百它物品或其他容器中。希望遞歸深度不超過十幾個級別。 (猜測)計算是得到一個加權平均值。

+1

我想知道更多關於計算......函數無疑會起到一定的作用,但您會驚訝於可以使用子查詢和視圖執行的一些瘋狂事情。我喜歡遊標,但他們經常被誹謗... – Fosco 2010-07-16 20:22:13

+1

您能否提供更多信息 - 特別是關於遞歸存盤的性質。 – 2010-07-16 20:23:08

+2

這是SQL Server嗎?如果您使用的是SQL 2008,則可以使用遞歸CTE完成大多數任務,而不需要任何光標。代碼示例如何,以便我們可以看到您正在嘗試執行的操作? – JohnFx 2010-07-16 20:26:54

回答

0

我想你會得到一個錯誤,因爲相同的遊標名稱可能是由每一個遞歸調用使用,直到父調用關閉遊標嵌套調用無法打開同名的光標。如果可能,是否可以將光標名稱設爲動態,可能與SOME_CURSOR_{$RECURSION_DEPTH}一樣簡單,但您可能必須將遞歸深度作爲參數添加到過程中。我從來沒有在SQL Server中做過這樣的事情,但我不是100%確定的。

不能確定下一/插入EXEC問題,儘管它可能被捆綁到光標。

0
DECLARE StudentdIDCursor CURSOR LOCAL FOR SELECT ...blahblah 

的關鍵是LOCAL項。它會每次在幕後生成一個單獨的光標定義。