Давайте создадим таблицу, в которой есть ваши столбцы
CREATE TABLE T(
Val VARCHAR(45),
Seq INT,
Sequence INT
);
INSERT INTO T VALUES
('A', 1, 2),
('C', 2, 1),
('B', 3, 3);
Теперь давайте посмотрим на ваш код и приведем условия:
Вот ваш код:
ORDER BY
CASE
WHEN @T='ABC' Then Val,Seq
ELSE Sequence END
- Если
@T = 'ABC
, тогда заказывайте по Val
и Seq
И НЕ заказывайте по Sequence
.
- Если
@T <> 'ABC'
, то заказать Только с Sequence
.
Если вы выполните этот запрос:
--You was trying--
DECLARE @T VARCHAR(3) = 'ABC'; --wil works only when @T <> ABC
SELECT *
FROM T
ORDER BY CASE WHEN @T='ABC' THEN Seq END, --Take INT
CASE WHEN @T='ABC' THEN Val --Take Varchar
ELSE Sequence -- Take INT
END;
Будет выдано следующее сообщение об ошибке, если @T = 'ABC'
Msg 245 Уровень 16 Состояние 1 Строка 5
Ошибка преобразования при преобразовании значения varchar 'A' в тип данных int.
так же, как вы получаете
Преобразование не удалось при преобразовании значения nvarchar 'EX-02-60' в тип данных int.
Теперь, вот что вы хотите в соответствии с условиями, которые вы предоставляете:
--Fixes--
DECLARE @T VARCHAR(3) = '1'; --Try to change it to ABC too
SELECT *
FROM T
ORDER BY CASE WHEN @T='ABC' THEN Val END, --Take varchar
CASE WHEN @T='ABC' THEN Seq -- Take INT
ELSE Sequence -- Take INT
END;
/*
IF @T = ABC
ORDER BY Val, Seq; NOT Sequence
IF @T <> ABC
ORDER BY ONLY Sequence
*/
А вот и Живая демоверсия