Глядя на вашу функцию, кажется, что вы вызываете ее рекурсивно, даже если нет 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