2015-03-11 3 views
-2

У меня эта неприятная проблема на SQL Server, где я пытаюсь добавить ORDER BY @sortColumn.ORDER BY CASE в SQL Server

PROCEDURE [dbo].[pr_get_checklist_activity] 
(
    @userId int, 
    @sortColumn varchar 
) 
[...] 
SELECT 
    checklist.checklist_id, 
    [etc] 
[... SQL BLA BLA ...] 
ORDER BY 
    CASE WHEN @sortColumn = 'checklist_id' 
     THEN checklist.checklist_id END, 
    CASE WHEN @sortColumn = 'percentage' 
     THEN checklist.afgerond_percentage END, 
    CASE WHEN @sortColumn = 'aangemaakt_op' 
     THEN checklist.aangemaakt_op END; 

Теперь, когда я пытаюсь запустить его с чем-то вроде:

[dbo].[pr_get_checklist_activity] 19, 'percentage' 

или

[dbo].[pr_get_checklist_activity] 19, 'aangemaakt_op' 

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

Я создаю его как хранимую процедуру в SQL Server Management Studio и используя VB.

ответ

2

Ваш скрипт работает нормально. Все выглядит нормально, за исключением 1 маленькой вещи:

@sortColumn varchar 

это сделает @sortColumn 1 character long. Put длину на нем

ALTER PROCEDURE [dbo].[pr_get_checklist_activity] 
(
@userId int, 
@sortColumn varchar(40) 

) as 

Это будет исправить ваш скрипт

1

Ваш пункт Order By должен, вероятно, это:

ORDER BY 
CASE 
WHEN @sortColumn = 'checklist_id' THEN checklist.checklist_id 
WHEN @sortColumn = 'percentage' THEN checklist.afgerond_percentage 
WHEN @sortColumn = 'aangemaakt_op' THEN checklist.aangemaakt_op 
END; 

Кроме того, вы должны определить длину для параметра @sortColumn. IIRC SQL Server будет назначать только, что длина 1.

Таким образом, вы сохранили определение Proc должно быть:

PROCEDURE [dbo].[pr_get_checklist_activity] 
(
@userId int, 
@sortColumn varchar(50) 

) 
+4

Вы пропустили удалить запятую в конце второй, когда линия. – jarlh

+0

@jarlh Хороший улов, спасибо! – codingbadger

+2

Первая часть вашего ответа будет работать только в том случае, если 3 столбца имеют одинаковый тип. Попробуйте его с помощью varchar, date и integer. Синтаксис размещенного вопроса работает лучше –