Ошибка функции SQL Ошибка максимального предела - PullRequest
0 голосов
/ 05 июля 2019
ALTER FUNCTION [PtOrderDetailID]
    (@OrderDetail_ID INT)  
RETURNS INT  
AS  
BEGIN  
    DECLARE @OriginalOrderDetail_ID AS INT  
    SET @OriginalOrderDetail_ID = @OrderDetail_ID  

    IF (SELECT COUNT(1) FROM TRRawDetail OD (NOLOCK) 
        WHERE OD.OrderDetail_ID = @OriginalOrderDetail_ID 
          AND OD.RelatedOrderDetail_ID IS NOT NULL 
          AND OD.RelatedOrderDetail_ID <> 0) > 0  
        SET @OriginalOrderDetail_ID = (SELECT TOP 1 OD.RelatedOrderDetail_ID 
                                       FROM TRRawDetail OD (NOLOCK)  
                                       WHERE OD.OrderDetail_ID = @OriginalOrderDetail_ID 
                                         AND OD.RelatedOrderDetail_ID IS NOT NULL 
                                         AND OD.RelatedOrderDetail_ID <> 0)  

    SET @OriginalOrderDetail_ID = PtOrderDetailID(@OriginalOrderDetail_ID)  

    RETURN @OriginalOrderDetail_ID;  
END
GO

Функция вызывается из хранимой процедуры, но выдает ошибку «Maximum Limit (32)».Помогите решить эту проблему

Сообщение 217, Уровень 16, Состояние 1, Строка 200
Превышен максимальный уровень вложенности хранимой процедуры, функции, триггера или представления (ограничение 32)

Я думал, что это функция, вызываемая внутри вложенного рекурсивного вызова.Как решить эту проблему?

1 Ответ

0 голосов
/ 05 июля 2019

Глядя на вашу функцию, кажется, что вы вызываете ее рекурсивно, даже если нет relatedorder_detail, и в этом случае она будет продолжать вызывать рекурсивно, используя первоначально переданный OrderDetail_ID.Вы должны поместить рекурсивный вызов в блок IF

ALTER FUNCTION [PtOrderDetailID]
    (@OrderDetail_ID INT)  
RETURNS INT  
AS  
BEGIN  
    DECLARE @OriginalOrderDetail_ID AS INT  
    SET @OriginalOrderDetail_ID = @OrderDetail_ID  

    IF (SELECT COUNT(1) FROM TRRawDetail OD (NOLOCK) 
        WHERE OD.OrderDetail_ID = @OriginalOrderDetail_ID 
          AND OD.RelatedOrderDetail_ID IS NOT NULL 
          AND OD.RelatedOrderDetail_ID <> 0) > 0  
      BEGIN
        SET @OriginalOrderDetail_ID = (SELECT TOP 1 OD.RelatedOrderDetail_ID 
                                       FROM TRRawDetail OD (NOLOCK)  
                                       WHERE OD.OrderDetail_ID = @OriginalOrderDetail_ID 
                                         AND OD.RelatedOrderDetail_ID IS NOT NULL 
                                         AND OD.RelatedOrderDetail_ID <> 0)  

    SET @OriginalOrderDetail_ID = PtOrderDetailID(@OriginalOrderDetail_ID)  
    END
    RETURN @OriginalOrderDetail_ID;  
END
GO
...