2012-01-31 64 views
1

我已經閱讀了大量有關參數嗅探存儲過程和解決方法的文章(特別是在這裏)。例如,這裏:http://elegantcode.com/2008/05/17/sql-parameter-sniffing-and-what-to-do-about-it/參數嗅探和嵌套存儲過程

這是否也適用於由另一個存儲過程調用的存儲過程?即鏈接文章中描述的解決方案是否也適用於嵌套存儲過程。

此外,如果您在調用存儲過程中聲明一個名爲@PersonID的變量,是否可以在被調用的存儲過程中Decalre稱爲@PersonID的變量,即DECLARE PersonID int。這將是可變的陰影。

回答

2

是第一個。每個存儲過程是分開的,您需要在每個存儲過程中應用反嗅探技術(參數掩碼或更新的OPTIMISE FOR UNKNOWN)。

對第二個是,但不是您爲什麼這麼想。變量在該存儲過程中僅有的範圍。所以被調用者中的@PersonID與調用者中的@PersonID無關。如果你在被調用者中沒有@PersonID,那麼你的父親不在範圍內

+0

謝謝。因此,如果我在存儲過程2中存儲過程1和PersonID = 2中聲明瞭PersonID = 1,那麼在控制從存儲過程2傳回存儲過程1後,是否可以確認PersonID等於1?是否存在使用相同變量的風險名稱? – w0051977 2012-01-31 13:35:40

+0

是的,PersonID = 1將保留在proc 1中。proc 2的內部沒有任何影響。想想你的.net或java方法和「封裝」。沒有風險,如果它是有道理的。你的嵌套過程是一種方法,可以單獨調用 – gbn 2012-01-31 13:39:51

+0

謝謝。我幾乎準備好回答這個問題。我在顯式事務中使用'XACT_ABORT ON'來確保事務在存儲過程出錯時回滾。因此,如果VB6命令對象(這將調用存儲過程)存在超時,或者存儲過程引發異常;該計劃將處理它。我最近才發現:'XACT_ABORT ON'。從VB6程序調用存儲過程時還有什麼我應該考慮的嗎? – w0051977 2012-02-01 13:43:46