簡體   English   中英

Visual Studio(ado.net)中超出了最大存儲過程,函數,觸發器或視圖嵌套級別,但SQL服務器中沒有

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM