2015-05-18 6 views
0

У меня есть следующий оператор 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?!

+0

Вы можете рассмотреть вопрос о 'COALESCE (NULLIF (@ UseUnit, 0), mtDefUnit)', чтобы уменьшить количество вложенности/повторения (если, конечно, вы можете изменить настройки так, что '' NULL' @ UseUnit' представляет параметр «вернуться к умолчанию», тогда вы можете исключить «NULLIF» выше) –

+0

спасибо за отзыв, я заметил, что когда я удаляю второй выбор и заменяю его другим условием, тогда он работает! так что это может быть вызвано вторым оператором select –

ответ

0

Этот пример может помочь вам.

UPDATE table_name 
    SET column_name=CASE 
WHEN column_name in ('value1', 'value2',.....) 
    THEN 'update_value' 
WHEN column_name in ('value1', 'value2',.....) 
    THEN 'update_value' 
END 

 Смежные вопросы

  • Нет связанных вопросов^_^