Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Case expressions may only be nested to level 10.  [new]
saint
Member

Откуда: Архангельск
Сообщений: 2262
тут недавно наткунулся. может кому будет полезно.

ну во-первых само ограничение, про которое я нашел в BOL только текст ошибки и краткое пояснение к ней, что так де низя.

во-вторых, что более неприятно, при запросе к линкед сервер, конструкция вида:

select 
case 
when sdo.id = 147 then 421
when sdo.id = 293 then 304
when sdo.id = 303 then 416
when sdo.id = 145 then 417
when sdo.id = 146 then 420
when sdo.id = 151 then 302
when sdo.id = 153 then 306
when sdo.id = 152 then 303
when sdo.id = 154 then 307
when sdo.id = 155 then 309
when sdo.id = 156 then 310
--...
else sdo.id
end
from lnkd.db.dbo.mytbl

дает сабжевую ошибку. полагаю, текст експрешена преобразуется при передаче во вложенный CASE.

исходный сервер:
Microsoft SQL Server 2005 - 9.00.3054.00 (Intel X86) on Windows NT 5.2 (Build 3790: Service Pack 2)
13 ноя 07, 15:30    [4910261]     Ответить | Цитировать Сообщить модератору
 Re: Case expressions may only be nested to level 10.  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
А если переписать так:

case sdo.id
  when 147 then 421
  when 293 then 304
...

Но, напрашивается перекодировочная таблица, IMHO.
13 ноя 07, 15:33    [4910279]     Ответить | Цитировать Сообщить модератору
 Re: Case expressions may only be nested to level 10.  [new]
saint
Member

Откуда: Архангельск
Сообщений: 2262
pkarklin
А если переписать так:

case sdo.id
  when 147 then 421
  when 293 then 304
...

Но, напрашивается перекодировочная таблица, IMHO.


вот это
declare @i int
set @i=0

select 
case @i
when 0 then 1
when 1 then 2
when 2 then 3
when 3 then 4
when 4 then 5
when 5 then 6
when 6 then 7
when 7 then 8
when 8 then 9
when 9 then 10
when 10 then 11
when 11 then 12
end
from srv.master.dbo.syslogins
дает ту же ошибку

по поводу таблицы-транслятора - согласен, так обычно и делаем. суть топика не в реализации алгоритма трансляции, а в поведении CASE.
13 ноя 07, 15:53    [4910445]     Ответить | Цитировать Сообщить модератору
 Re: Case expressions may only be nested to level 10.  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
А если не к линкованному серверу - таже ошибка? Ибо приведенный запрос, на мой взгляд, к "вложенности" не имеет никакого отношения. А что в плане, при числе WHEN < 10?
13 ноя 07, 16:00    [4910494]     Ответить | Цитировать Сообщить модератору
 Re: Case expressions may only be nested to level 10.  [new]
BusyMan
Member

Откуда: Москва
Сообщений: 4927
pkarklin
А если не к линкованному серверу - таже ошибка? Ибо приведенный запрос, на мой взгляд, к "вложенности" не имеет никакого отношения. А что в плане, при числе WHEN < 10?
не дает он никакой ошибки... и вообще это близко даже к вложенности отношения не имеет!

автору:

вложенность - это когда

 CASE 
   CASE 
      CASE 
         CASE 

      .... 
13 ноя 07, 16:26    [4910688]     Ответить | Цитировать Сообщить модератору
 Re: Case expressions may only be nested to level 10.  [new]
BusyMan
Member

Откуда: Москва
Сообщений: 4927
Вот вам вложенность

declare @i int
set @i=0

select 
case @i when 0 then 
  case @i when 0 then 
	case @i when 0 then 
	 case @i when 0 then 
 	  case @i when 0 then 
 	   case @i when 0 then 
 	    case @i when 0 then 
 	     case @i when 0 then 
 	      case @i when 0 then 
 	       case @i when 0 then 
 	        case @i when 0 then 
             1 
            end
           end
          end
         end
        end
       end
      end
     end
    end
  end
end
from  master.dbo.syslogins

и вот только так выдает ошибку:
Msg 125, Level 15, State 3, Line 15
Case expressions may only be nested to level 10.
13 ноя 07, 16:30    [4910733]     Ответить | Цитировать Сообщить модератору
 Re: Case expressions may only be nested to level 10.  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
2 BusyMan

Автор топика не первый, кто сталкивается с озвученной ошибкой.
13 ноя 07, 16:31    [4910747]     Ответить | Цитировать Сообщить модератору
 Re: Case expressions may only be nested to level 10.  [new]
saint
Member

Откуда: Архангельск
Сообщений: 2262
pkarklin
А если не к линкованному серверу - таже ошибка? Ибо приведенный запрос, на мой взгляд, к "вложенности" не имеет никакого отношения. А что в плане, при числе WHEN < 10?


если не к линкованному - все ok. потому и пишу - "линкованный".
если число "WHEN" <=10, ошибки нет.

SET SHOWPLAN_TEXT ON
go
declare @i int
set @i=0

select 
case @i
when 0 then 1
when 1 then 2
when 2 then 3
when 3 then 4
when 4 then 5
when 5 then 6
when 6 then 7
when 7 then 8
when 8 then 9
when 9 then 10

end
from dbs.master.dbo.syslogins
дает:
|--Remote Query(SOURCE:(dbs), QUERY:(SELECT CASE WHEN ?=(0) THEN (1) ELSE CASE WHEN ?=(1) THEN (2) ELSE CASE WHEN ?=(2) THEN (3) ELSE CASE WHEN ?=(3) THEN (4) ELSE CASE WHEN ?=(4) THEN (5) ELSE CASE WHEN ?=(5) THEN (6) ELSE CASE WHEN ?=(6) THEN (7) ELSE CASE WHEN ?=(7) THEN (8) ELSE CASE WHEN ?=(8) THEN (9) ELSE CASE WHEN ?=(9) THEN (10) ELSE NULL END END END END END END END END END END "Expr1003" FROM "master"."dbo"."syslogins" "Tbl1002"))

те моя догадка претендует на правду.
13 ноя 07, 16:53    [4910923]     Ответить | Цитировать Сообщить модератору
 Re: Case expressions may only be nested to level 10.  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
автор
те моя догадка претендует на правду.


Эт не догадка. При передачи запроса линкованному серверу оптимизатор явно накосячил, превратив обычный CASE вложенный. Запрос нельзя переписать на OPENQUERY?
13 ноя 07, 16:57    [4910952]     Ответить | Цитировать Сообщить модератору
 Re: Case expressions may only be nested to level 10.  [new]
saint
Member

Откуда: Архангельск
Сообщений: 2262
pkarklin
автор
те моя догадка претендует на правду.


Эт не догадка. При передачи запроса линкованному серверу оптимизатор явно накосячил, превратив обычный CASE вложенный. Запрос нельзя переписать на OPENQUERY?


это была серия одноразовых запросов - мерж данных. и в принципе задача уже сделана.
интересно, это всегда оптимизатор так косячит, или только при какихто условиях.
13 ноя 07, 18:15    [4911499]     Ответить | Цитировать Сообщить модератору
 Re: Case expressions may only be nested to level 10.  [new]
Mishanja
Member

Откуда:
Сообщений: 84
ktoto nashel reshenie probleme?
20 фев 08, 18:23    [5318395]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Case expressions may only be nested to level 10.  [new]
max_2015
Member

Откуда:
Сообщений: 8
тоже столкнулся с такой же проблемой с CASE при запросе на линксервер.
Решил так (на примере от автора темы)

select
ISNULL(ISNULL( ... (ISNULL(
case

when sdo.id = 147 then 421
when sdo.id = 293 then 304
when sdo.id = 303 then 416
when sdo.id = 145 then 417
when sdo.id = 146 then 420
when sdo.id = 151 then 302
when sdo.id = 153 then 306
when sdo.id = 152 then 303
when sdo.id = 154 then 307
when sdo.id = 155 then 309
ELSE NULL END,
CASE

when sdo.id = 156 then 310
--...
ELSE NULL END),
...
ELSE NULL END),
else sdo.id end))...)
23 сен 15, 15:31    [18185680]     Ответить | Цитировать Сообщить модератору
 Re: Case expressions may only be nested to level 10.  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
max_2015,

почему это всё нельзя собрать в таблице (постоянной, временной, табличной переменной)
или в CTE, наконец? И CASE тогда не понадобится.
23 сен 15, 15:35    [18185694]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить