共用方式為


巢狀預存程序

當某個預存程序參考 CLR 常式、類型或彙總,以呼叫另一個預存程序或執行 Managed 程式碼,預存程序將為巢狀。預存程序和 Managed 程式碼參考最多可巢狀至 32 層。被呼叫的預存程序或 Managed 程式碼參考開始執行時,巢狀層級加一,被呼叫的預存程序或 Managed 程式碼參考執行完畢時,巢狀層級就減一。若試圖使巢狀層級超過最大值 32 層,會使得整個呼叫鏈結都失敗。預存程序目前執行中的巢狀層級儲存在 @@NESTLEVEL 函數中。

[!附註]

任何從 Transact-SQL 預存程序對 Managed 程式碼的參考,都會算成 32 層巢狀限制中的一層。從 Managed 程式碼內叫用的方法不會算在此限制內。

當預存程序參考 CLR 常式、類型或彙總以執行 Managed 程式碼時,此參考也會算為巢狀的一層。從 Managed 程式碼內叫用的方法不會算在此限制內。目前的巢狀結構層級會由 @@NESTLEVEL 函數傳回。當 CLR 預存程序透過 MicrosoftSQL Server Managed 提供者來執行資料存取時,一個額外的巢狀層級會加入從 Managed 程式碼至 SQL 的轉換中,而且此層級會反映在 @@NESTLEVEL 函數中。

巢狀預存程序中發生的錯誤,對呼叫的預設程序而言並不一定是嚴重錯誤。在預存程序內叫用預存程序時,應使用 Transact-SQL 的 RETURN 陳述式傳回傳回碼,並從呼叫預存程序來檢查傳回碼。這樣一來,就可以指定預存程序發生錯誤時的運作方式。如需使用傳回碼的詳細資訊,請參閱使用傳回碼傳回資料

預存程序甚至可以執行呼叫本身的巢狀呼叫,這種技術稱為遞迴。

雖然巢狀限制為 32 層,但 SQL Server 對於可從給定預存程序中叫用的預存程序個數則沒有限制,只要從屬的預存程序不會叫用其他從屬的預存程序,而且巢狀層級不超過最大值。