У меня есть следующий оператор SQL, при его выполнении на SQL 2008 он отлично работает без проблем. Но когда excuted в SQL 2000 он говорит:Вложенный корпус в SQL 2000
Internal SQL Server ошибка
Я думаю, что проблема возникает из-за использования вложенного заявление дела в SQL 2000. Вот это SQL заявление:
WHEN 14 THEN
Case When (select COUNT(*) from [dbo].[mnrFnBI_Fixed](@CurrencyID) f where f.BAccCustID!=0x0 AND f.biMatID = bi.biMatID)>0 THEN
CASE (select top 1 PriceType from (select top 1 f.BDate,f.BNumber , tc.PriceType From [dbo].[mnrFnBI_Fixed](@CurrencyID) f inner join #tcust tc on tc.AccID = f.BAccCustID AND tc.PriceType!=0 Where f.biMatID =bi.biMatID AND f.BAccCustID != 0x0 order by f.BDate desc,f.BNumber desc) as k) -- Price From customer Card
WHEN 1 THEN
CASE @UseUnit WHEN 1 THEN mtEndUser1
WHEN 2 THEN mtEndUser2
WHEN 3 THEN mtEndUser3
WHEN 4 THEN mtEndUser4
WHEN 5 THEN mtEndUser5
WHEN 0 THEN CASE [mtDefUnit] WHEN 1 THEN mtEndUser1
WHEN 2 THEN mtEndUser2
WHEN 3 THEN mtEndUser3
WHEN 4 THEN mtEndUser4
WHEN 5 THEN mtEndUser5
END
END
---*******************---
WHEN 2 THEN
CASE @UseUnit WHEN 1 THEN mtWhole1
WHEN 2 THEN mtWhole2
WHEN 3 THEN mtWhole3
WHEN 4 THEN mtWhole4
WHEN 5 THEN mtWhole5
WHEN 0 THEN CASE [mtDefUnit] WHEN 1 THEN mtWhole1
WHEN 2 THEN mtWhole2
WHEN 3 THEN mtWhole3
WHEN 4 THEN mtWhole4
WHEN 5 THEN mtWhole5
END
END
---*******************---
END
END
Когда я удаляю деталь между «*****», она отлично работает!
Пожалуйста, скажите, как работает оператор case с SQL 2000?!
Update: при изменении приведенный выше код:
WHEN 14 THEN
Case
WHEN (select COUNT(*) from [dbo].[mnrFnBI_Fixed](@CurrencyID) f where f.BAccCustID!=0x0 AND f.biMatID = bi.biMatID)>0 THEN
case
when (select top 1 PriceType from (select top 1 f.BDate,f.BNumber , tc.PriceType From [dbo].[mnrFnBI_Fixed](@CurrencyID) f inner join #tcust tc on tc.AccID = f.BAccCustID AND tc.PriceType!=0 Where f.biMatID =bi.biMatID AND f.BAccCustID != 0x0 order by f.BDate desc,f.BNumber desc) as k) =1 THEN
CASE @UseUnit WHEN 1 THEN mtEndUser1
WHEN 2 THEN mtEndUser2
WHEN 3 THEN mtEndUser3
WHEN 4 THEN mtEndUser4
WHEN 5 THEN mtEndUser5
WHEN 0 THEN CASE [mtDefUnit] WHEN 1 THEN mtEndUser1
WHEN 2 THEN mtEndUser2
WHEN 3 THEN mtEndUser3
WHEN 4 THEN mtEndUser4
WHEN 5 THEN mtEndUser5
END
END
when(select top 1 PriceType from (select top 1 f.BDate,f.BNumber , tc.PriceType From [dbo].[mnrFnBI_Fixed](@CurrencyID) f inner join #tcust tc on tc.AccID = f.BAccCustID AND tc.PriceType!=0 Where f.biMatID =bi.biMatID AND f.BAccCustID != 0x0 order by f.BDate desc,f.BNumber desc) as k) = 2 THEN
CASE @UseUnit WHEN 1 THEN mtWhole1
WHEN 2 THEN mtWhole2
WHEN 3 THEN mtWhole3
WHEN 4 THEN mtWhole4
WHEN 5 THEN mtWhole5
WHEN 0 THEN CASE [mtDefUnit] WHEN 1 THEN mtWhole1
WHEN 2 THEN mtWhole2
WHEN 3 THEN mtWhole3
WHEN 4 THEN mtWhole4
WHEN 5 THEN mtWhole5
END
END
END
END
это работает, так что, пожалуйста, что случилось с первыми командами SQL в SQL Server 2000?!
Вы можете рассмотреть вопрос о 'COALESCE (NULLIF (@ UseUnit, 0), mtDefUnit)', чтобы уменьшить количество вложенности/повторения (если, конечно, вы можете изменить настройки так, что '' NULL' @ UseUnit' представляет параметр «вернуться к умолчанию», тогда вы можете исключить «NULLIF» выше) –
спасибо за отзыв, я заметил, что когда я удаляю второй выбор и заменяю его другим условием, тогда он работает! так что это может быть вызвано вторым оператором select –