Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Неявное преобразование в integer в динамически (case when @par=.. ) определяемой колонке  [new]
McCar
Member

Откуда: Саратов
Сообщений: 775
Все привет.
MS SQL 2014
В рамках некой задачи, где нужна сортировка по заданному пользователем атрибуту, столкнулся с такой проблемой.
Можно продемонстрировать на таком запросе:
declare @sortColum int=1;
with x
as (Select 'textColumn' as textCol, 1 as intCol),
xx as (select x.IntCol, x.TextCol, case  @sortColum when 2 then x.intCol else x.textCol end as SortAttribute  from x)
select * from xx 
--order by x.SortAttribute

С @sortColum=2 (интовое поле) - все нормально, с 1 - валится с
Conversion failed when converting the varchar value 'textColumn' to data type int
То есть логика такая - если при определенных условиямх поле может быть int, значит оно будет всегда int.
Ладно, допустим, не может он определить тип поля "на лету", но почему int, а не текст?
И как это обойти, кроме Dynamic SQL?
12 фев 18, 10:22    [21184590]     Ответить | Цитировать Сообщить модератору
 Re: Неявное преобразование в integer в динамически (case when @par=.. ) определяемой колонке  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4535
McCar, явным кастом к нужному типу.
12 фев 18, 10:31    [21184621]     Ответить | Цитировать Сообщить модератору
 Re: Неявное преобразование в integer в динамически (case when @par=.. ) определяемой колонке  [new]
McCar
Member

Откуда: Саратов
Сообщений: 775
buser,
Да понятно что можно к тексту скастовать, если бы речь шла просто о отображании на UI, но тут речь идет про сортировку, - мне не надо чтобы число сортировалось как текст
12 фев 18, 10:50    [21184682]     Ответить | Цитировать Сообщить модератору
 Re: Неявное преобразование в integer в динамически (case when @par=.. ) определяемой колонке  [new]
Minamoto
Member

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

order by case @sortColum when 2 then x.intCol else null end, case @sortColum when 2 then null else x.textCol end
12 фев 18, 10:54    [21184697]     Ответить | Цитировать Сообщить модератору
 Re: Неявное преобразование в integer в динамически (case when @par=.. ) определяемой колонке  [new]
McCar
Member

Откуда: Саратов
Сообщений: 775
Что интересно, для если речь идет только о стринговых полях или только о числовых, оно вполне себе может определять тип колонки в result-set-е "на лету".
declare @sortColum int=2;
with x
as (Select cast(1 as int) as intcol,  cast(2.3 as decimal(2,1)) as  numericCol),
xx as (select x.intcol, x.numericCol, case  @sortColum when 1 then x.intcol else x.numericCol end as SortAttribute  from x)
select xx.* from xx 

Пришлось разбить колонки на две группы, - числовые и строковые, и для каждого делать отдельный order by.

По мне все это как то странно, и больше похоже на багу чем фичу.
12 фев 18, 11:58    [21184899]     Ответить | Цитировать Сообщить модератору
 Re: Неявное преобразование в integer в динамически (case when @par=.. ) определяемой колонке  [new]
iap
Member

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

почитали бы доку сначала: Приоритет типов данных
12 фев 18, 12:05    [21184929]     Ответить | Цитировать Сообщить модератору
 Re: Неявное преобразование в integer в динамически (case when @par=.. ) определяемой колонке  [new]
iap
Member

Откуда: Москва
Сообщений: 46953
iap
McCar,

почитали бы доку сначала: Приоритет типов данных
Выражение CASE
Возвращает выражение с наивысшим приоритетом из набора выражений
result_expressions и необязательного выражения else_result_expression
https://msdn.microsoft.com/ru-ru/library/ms181765(v=sql.110).aspx
12 фев 18, 12:07    [21184942]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить