Не удалось связать идентификатор из нескольких частей - PullRequest
3 голосов
/ 21 октября 2010

Я знаю, что есть несколько вопросов об этом исключении для SO, но ничего такого, что мне не помогло.

У меня следующий запрос, который дает мне "Multi-part identifier 'claim.fiData' could not be bound" -Exception:

SELECT  claim.idData FROM tabData as claim 
 INNER JOIN dbo._previousClaimsByFiData(claim.fiData) AS prevClaim 
 ON prevClaim.idData=claim.fiData 
GROUP BY claim.idData
HAVING(prevClaim.fiMaxActionCode IN (8, 23, 24) and 
prevClaim.Repair_Completion_Date >= DATEADD(day,-90,prevClaim.Repair_Completion_Date))
ORDER BY claim.idData

previousClaimsByFiData - это табличная функция, которая возвращает все предыдущие записи. Вы можете найти его здесь , если вам интересно. Теперь я хочу найти все заявки, которые имели предыдущие заявки за последние 90 дней, с maxActionCode IN (8, 23, 24).

Я также попробовал следующее:

SELECT  count(*) FROM tabData as claim 
where exists(
 select 1 from dbo._previousClaimsByFiData(claim.fiData)as prevClaim where 
  prevClaim.fiMaxActionCode IN(8, 23, 24)and 
  prevClaim.Repair_Completion_Date >= DATEADD(day,-90,claim.Repair_Completion_Date)
)

Но это дает мне "The maximum recursion 100 has been exhausted before statement completion" - исключение.

Почему я получаю эти исключения и как их избежать?

Спасибо

EDIT: задал другой вопрос , который сводится к основной проблеме. Я могу удалить это, когда получу ответ.

UPDATE: Марк ответил на упрощенный вопрос в соответствии с этим здесь . Таким образом, путь - это Cross Apply . Но теперь у меня есть следующая проблема, о которой я уже упоминал выше. Я получаю сообщение об ошибке «Максимальная рекурсия 100 была исчерпана до завершения инструкции» через несколько секунд. Я не знаю, где добавить опцию (MAXRECURSION 0), потому что я получаю «неправильный синтаксис», если я пытаюсь добавить его в Inline-TVF.

Мой текущий запрос:

SELECT  claim.idData FROM tabData  claim 
    CROSS APPLY dbo._previousClaimsByFiData(claim.fiData)AS tvfData 
GROUP BY claim.idData,claim.Repair_Completion_Date,tvfData.Repair_Completion_Date,tvfData.fiMaxActionCode
HAVING(tvfData.fiMaxActionCode IN (8, 23, 24) and 
tvfData.Repair_Completion_Date >= DATEADD(day,-90,claim.Repair_Completion_Date))
ORDER BY claim.idData


ОБНОВЛЕНИЕ: решение было добавить ОПЦИЮ (MAXRECURSION 0) в конец инструкции SELECT.

1 Ответ

1 голос
/ 21 октября 2010

Решением было добавить OPTION (MAXRECURSION 0) в конец инструкции SELECT.Рабочий запрос теперь:

SELECT claim.idData,claim.Repair_Completion_Date,prevClaim.Repair_Completion_Date,prevClaim.fiMaxActionCode FROM tabData  claim 
    CROSS APPLY dbo._previousClaimsByFiData(claim.fiData)AS prevClaim 
GROUP BY claim.idData,claim.Repair_Completion_Date,prevClaim.Repair_Completion_Date,prevClaim.fiMaxActionCode
HAVING(prevClaim.fiMaxActionCode IN (8, 23, 24) and 
prevClaim.Repair_Completion_Date >= DATEADD(day,-90,claim.Repair_Completion_Date))
ORDER BY claim.idData
OPTION (MAXRECURSION 0)

Это не самый быстрый запрос (для получения 23000 записей в таблице записей> 11Mio требуется больше минуты), но он работает.

ОБНОВЛЕНИЕ:следующий запрос выполняется намного быстрее (<4 секунды) и использует <code>EXISTS без CROSS APPLY:

  SELECT     idData
    FROM     tabData AS claim
    WHERE    fiProductType=1 and fiClaimStatus IN(1,5,7,8,9) AND EXISTS
         (SELECT idData
          FROM   dbo._previousClaimsByFiData(claim.fiData) AS prevClaim
          WHERE  (fiProductType = 1) AND (fimaxActionCode IN (8, 23, 24)) 
          AND (Repair_Completion_Date >= DATEADD(dd, - 90, DATEADD(dd, DATEDIFF(dd,0, claim.Repair_Completion_Date), 0))) 
          AND (Repair_Completion_Date <= claim.Repair_Completion_Date)) 
  order by claim.idData
  OPTION (MAXRECURSION 0)
...