Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите пожалуйста с запросом  [new]
JuliJ
Member

Откуда:
Сообщений: 42
Не могу понять в чем причина ошибки?

  create table #Channel (   ChannelId int,
                           	  ChannelNm nvarchar(100))     
	  
  insert into #Channel select 1,'Channel1'



declare  @sortingCol nvarchar(20)  
declare   @sortingDir nchar(4)

set   @sortingCol='ChannelNm'
set  @sortingDir = 'DESC'


Select ChannelId,
         ChannelNm,
         ROW_NUMBER() OVER (
              order by 
                case when(@sortingDir = 'ASC') then case when @sortingCol='ChannelNm' then                
                                                                        ChannelNm  else ChannelId end
                end asc,

                case when(@sortingDir <> 'ASC') then case when @sortingCol='ChannelNm' then 
                                                                        ChannelNm else ChannelId end
                end desc)

from #Channel

drop table #Channel

Получаю след ошибку "Conversion failed when converting the nvarchar value 'Channel1' to data type int".
Когда комментирую "else ChannelId ", то все работает.
14 июл 09, 23:19    [7416381]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с запросом  [new]
Glory
Member

Откуда:
Сообщений: 104760
Потому что case возвращает самый старший тип данных из тех, что описаны в then-ах. И автоматически конвертирует другие типы к этому старшему типу
Об этом написано в хелпе по case
14 июл 09, 23:50    [7416430]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с запросом  [new]
JuliJ
Member

Откуда:
Сообщений: 42
Понятно, спасибо.
В таком случае, как возможно переделать этот запрос? Задача - обойтись без динамического запроса.
15 июл 09, 00:16    [7416463]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с запросом  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
JuliJ
В таком случае, как возможно переделать этот запрос? Задача - обойтись без динамического запроса.
???
Select ChannelId,
         ChannelNm,
         ROW_NUMBER() OVER (
              order by 
                case when(@sortingDir = 'ASC') then case when @sortingCol='ChannelNm' then                
                                                                        2 else 1 end
                end asc,

                case when(@sortingDir <> 'ASC') then case when @sortingCol='ChannelNm' then 
                                                                        2 else 1 end
                end desc)

from #Channel
15 июл 09, 06:22    [7416579]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с запросом  [new]
Michael_N
Member

Откуда: Белокуриха, АК
Сообщений: 150
JuliJ,

....
if (@sortingDir = 'ASC')
Select ChannelId,
         ChannelNm,
         ROW_NUMBER() OVER (order by ChannelNm) from #Channel
else
Select ChannelId,
         ChannelNm,
         ROW_NUMBER() OVER (order by ChannelId ) from #Channel
...
15 июл 09, 06:38    [7416585]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с запросом  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2549
а просто и в лоб?
...
ChannelNm else cast(ChannelId AS nvarchar(max)) end
...
ChannelNm else cast(ChannelId AS nvarchar(max)) end
...
15 июл 09, 09:48    [7417006]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с запросом  [new]
JuliJ
Member

Откуда:
Сообщений: 42
tpg, спасибо!

PaulYoung, в лоб не получится, т.к. отсортируется так: 1,111,2
15 июл 09, 16:58    [7420194]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить