![](/img/trans.png)
[英]Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32) using SQL Server 2014
[英]Maximum stored procedure, function, trigger, or view nesting level exceeded in Visual Studio (ado.net) but not in SQL server
我有一個遞歸SQL函數的問題。 最初的問題是我有一份員工名單,每個員工都有各種培訓。 這些培訓中的每一項都有一些預先要求。 例如,要獲得1級駕駛執照,您必須擁有5級。如果我刪除5級,我需要檢查禁用1級。
現在因為這是一棵沒有固定最大深度的樹(實際上我停止以10ish檢查)我決定使用遞歸。 我寫了兩個存儲過程
[dbo].[spCheckTrainingPreqs]
@PIN int,
@training_id int,
@missingTraining int OUTPUT
和
[dbo].[spCheckTrainingPreqsEmployee]
@PIN int
現在,當我使用員工編號調用spCheckTrainingPreqsEmployee時,它會為每個pin / training_id組合創建一個游標並調用spCheckTrainingPreqs。 spCheckTrainingPreqs使用遞歸本地光標來遍歷樹。
現在是踢球者。 它在視覺工作室中工作正常
DECLARE @return_value int
EXEC @return_value = [dbo].[spCheckTrainingPreqsEmployee]
@PIN = 12673
SELECT 'Return Value' = @return_value
GO
但是,如果我進入visual studio並將其作為存儲過程添加到表適配器而沒有返回,我會收到錯誤“最大存儲過程,函數,觸發器或視圖嵌套級別超出(限制32)”
我已經檢查過我的桌子都沒有觸發器。 唯一的復雜性是許多表具有基於它們的視圖,具有子查詢甚至是ac#編碼的自定義連接功能。 記得從SQL管理器運行它工作正常。
完整代碼供參考
/****** Object: StoredProcedure [dbo].[spCheckTrainingPreqs] Script Date: 08/31/2010 10:13:36 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROC [dbo].[spCheckTrainingPreqs]
@PIN int,
@training_id int,
@missingTraining int OUTPUT
AS
-- get the Prerequisites
declare @requiresID int
declare CurPrereqs cursor local for SELECT RequiresID FROM TrainingPrerequisites WHERE SourceID = @training_id
SET @missingTraining = 0
OPEN CurPrereqs
FETCH NEXT FROM CurPrereqs INTO @requiresID
WHILE @@FETCH_STATUS = 0
BEGIN
IF (@missingTraining = 0) -- stop when a missing training is found
BEGIN
IF (SELECT count(training_id) FROM employee_training WHERE PIN = @PIN AND training_id = @requiresID GROUP BY training_id) = 1
BEGIN
--they have the training
IF (@@NESTLEVEL < 10) -- we only check 10 levels deep
BEGIN
EXEC spCheckTrainingPreqs @PIN, @requiresID, @missingTraining
UPDATE employee_training SET missingPreReq = @missingTraining WHERE training_id = @training_id and PIN = @PIN;
END
END
ELSE
BEGIN
SET @missingTraining = @requiresID
UPDATE employee_training SET missingPreReq = @missingTraining WHERE training_id = @training_id and PIN = @PIN;
CLOSE CurPrereqs
DEALLOCATE CurPrereqs;
RETURN
END
END
FETCH NEXT FROM CurPrereqs INTO @requiresID
END
CLOSE CurPrereqs
DEALLOCATE CurPrereqs;
和
/****** Object: StoredProcedure [dbo].[spCheckTrainingPreqsEmployee] Script Date: 08/31/2010 10:28:27 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Create date: 08/31/2010
-- Description: Checks all pre reqs for an employee
-- =============================================
ALTER PROCEDURE [dbo].[spCheckTrainingPreqsEmployee]
@PIN int
AS
BEGIN
SET NOCOUNT ON;
declare @training_id int
declare @missingTraining int
SET @missingTraining = 0
declare CurPrereqsE cursor local for SELECT training_id FROM employee_training WHERE PIN = @PIN
OPEN CurPrereqsE
FETCH NEXT FROM CurPrereqsE INTO @training_id
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC spCheckTrainingPreqs @PIN, @training_id, @missingTraining
FETCH NEXT FROM CurPrereqsE INTO @training_id
END
CLOSE CurPrereqsE
DEALLOCATE CurPrereqsE;
END
當你說:
記得從SQL管理器運行它工作正常
您使用哪些值來測試參數? VS中的錯誤可能是由設計者的調用引起的。 值得檢查的是,您使用與設計人員使用的參數相同的參數來調用該過程。
嘗試使用SQL事件探查器跟蹤SQL調用並確切檢查VS傳遞的值。 然后,您可以從SQL管理器中執行完全相同的查詢。 我猜你會得到完全相同的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.