Процедура Превышен максимальный уровень вложенности хранимой процедуры, функции, триггера или представления (предел 32) - PullRequest
0 голосов
/ 22 февраля 2011

Сохраненный процесс не работает в указанном ниже месте, спасибо за вашу помощь.

--Insert MSOrg Information    

DECLARE @PersonnelNumber int,    
 @MSOrg   varchar(255)    

DECLARE csr CURSOR FAST_FORWARD FOR    
 SELECT PersonnelNumber FROM Person    

OPEN csr    

FETCH NEXT FROM csr     
 INTO @PersonnelNumber    

WHILE @@FETCH_STATUS = 0    
BEGIN    

 EXEC GetMSOrg @PersonnelNumber, @MSOrg out    

 INSERT INTO PersonSubject (    
   PersonnelNumber    
   ,SubjectID    
   ,SubjectValue    
   ,Created  
   ,Updated  
  )    
  SELECT @PersonnelNumber    
   ,SubjectID    
   ,@MSOrg    
   ,getDate()  
   ,getDate()  
  FROM Subject    
  WHERE DisplayName = 'MS Org'    

 FETCH NEXT FROM csr     
  INTO @PersonnelNumber    
END    

CLOSE csr    
DEALLOCATE csr    

Ниже приведено определение сохраненного prc GetMSOrg и происходит сбой при третьем условии

CREATE  PROCEDURE [dbo].[GetMSOrg]
(
    @PersonnelNumber    int
    ,@OrgTerm       varchar(200)    out
)
AS
DECLARE @MDRTermID          int
        ,@ReportsToPersonnelNbr int
--Check to see if we have reached the top of the chart
SELECT  @ReportsToPersonnelNbr = ReportsToPersonnelNbr
FROM        ReportsTo
WHERE   PersonnelNumber = @PersonnelNumber
IF (@ReportsToPersonnelNbr IS NULL) --Reached the Top of the Org Ladder
BEGIN
    SET @OrgTerm = 'Non-standard rollup'
END
ELSE IF (@PersonnelNumber IN (SELECT PersonnelNumber FROM OrgTermMap))
BEGIN
    SELECT  @OrgTerm = s.Term
    FROM    OrgTermMap tm
        JOIN Taxonomy..StaticHierarchy s ON tm.OrgTermID = s.TermID
    WHERE   tm.PersonnelNumber = @PersonnelNumber
END
ELSE
BEGIN
    SELECT  @MDRTermID = tm.OrgTermID
    FROM        ReportsTo r
        JOIN OrgTermMap tm ON r.ReportsToPersonnelNbr = tm.PersonnelNumber
    WHERE   r.PersonnelNumber = @PersonnelNumber
    IF (@MDRTermID IS NULL)
    BEGIN
        EXEC GetMSOrg @ReportsToPersonnelNbr, @OrgTerm out
    END
    ELSE
    BEGIN
        SELECT  @OrgTerm = Term
        FROM    Taxonomy..StaticHierarchy
        WHERE VocabID = 118
            AND TermID = @MDRTermID
    END
END

GO

1 Ответ

1 голос
/ 22 февраля 2011

Каждый вызов EXEC GetMSOrg продолжает выполняться по запросу

SELECT  @ReportsToPersonnelNbr = ReportsToPersonnelNbr
FROM        ReportsTo
WHERE   PersonnelNumber = @PersonnelNumber

И есть предложение выхода, когда PersonnelNumber больше никому не отчитывается.

Поэтому единственный логический вывод заключается в том, чтоу вас есть циклическое лицо -> отчеты для -> ..-> лица.Это может быть даже в одной записи.

Этот запрос найдет циклы в отчетах для записей:

declare @PersonnelNumber int
set @PersonnelNumber = 10

;with CTE as (
select 1 Level,
       convert(varchar(max),@PersonnelNumber) Seed,
       '>>' + convert(varchar(max),@PersonnelNumber) + '>>' Path
union all
SELECT Level+1,
       convert(varchar(max),ReportsToPersonnelNbr),
       Path + convert(varchar(max),ReportsToPersonnelNbr) + '>>'
FROM   ReportsTo
join CTE on CTE.Seed = ReportsTo.PersonnelNumber
where  Level < 40
)
select *
from CTE
where Len(Replace(Path, '>' + convert(varchar(max),Seed) + '>', ''))
  = LEN(Path) - Len('>' + convert(varchar(max),Seed) + '>') * 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...