2009-07-31 2 views
4

Каков правильный способ параметризации предложения order by в ADO.NET?Параметр «упорядочивается по» в SQL

Иногда бывает необходимо заказать по 2 столбца, а по умолчанию - только 1 столбец, а иногда вам просто нужно изменить ASC на DEC. Можно считать, что просто использовать конкатенацию строк в таких случаях (при условии, что входные данные поступают не от пользователя напрямую, а просто поиск более или менее жестко заданных значений в коде)

ответ

2

Пуристы SQL Injection скажут вы, что конкатенация строк никогда не допускается, потому что всегда существует возможность того, что другой программист может расширить программу и выставить SQL-запрос во внешний мир.

Однако, если значения жестко запрограммированы (т. Е. Как константа) и никогда не будут видеть внешний мир, то да, вполне нормально его конкатенировать.

+0

Это будет работать, но что вы будете делать, когда захотите @ Sortby1, а иногда @ Sortby1, @ Soryby2 - просто некоторые манипуляции с строкой? – nos

+0

Не в SQL Server. Использование материалов MS-клиента (в соответствии с тегами) может означать SQL Server – gbn

0

AS, так как пользователю не разрешено вводить текст или может получить доступ к переменной через URL-адрес, я не вижу никакой отрицательной причины при использовании конкатенации строк. Если, как говорит нижеприведенный парень, программа может быть расширена другим пользователем, который не является «сознательным введением».

0

Существуют чистые решения T-SQL, которые не используют динамический SQL.

  • Пред- SQL 2005, вы должны были использовать СЛУЧАЙ в ORDER BY
  • После SQL 2005, вы можете использовать ROW_NUMBER и т.д.

Некоторые ответы здесь: Dynamic order direction. Принятый ответ и мой ответ демонстрируют два подхода. Возможно, SQL Server.

0

Если это не так много данных, я бы просто:

DataTable dt = .... 
DataView dv = new DataView(dt); 
dv.Sort = "LastName DESC, FistName"; 

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

4

Попробуйте так:

SELECT ... 
ORDER BY 
    CASE WHEN @OrderBy = 'Option1' THEN SomeField END, 
    CASE WHEN @OrderBy = 'Option1' THEN SomeOtherField END DESC, 
    CASE WHEN @OrderBy = 'Option2' THEN Field75 END, 
    ... 

Идея заключается в том, что каждый случай заявление будет вычисляться в NULL, если КОГДА не совпадает. Поэтому, если вы поместите Option2, вы получите постоянное значение для первых двух параметров.

Таким образом, вы можете легко иметь некоторые параметры, которые позволяют сортировать по нескольким полям или нисходящим или любым другим, что вы хотите.

Роб

0

Пример:

SELECT 1 AS Num, '2015-06-22' AS Datex INTO Arya 
INSERT INTO Arya 
SELECT 2, '2015-08-17' UNION SELECT 3, '2015-07-14' 

Arya стол:

Num Datex 
----------------- 
1, 2015-06-22 
2, 2015-08-17 
3, 2015-07-14 

Теперь параметризующих сортировки (Base на Datex поле) в ВЫБОРА ....

SELECT Num, Date1 FROM ARYA, (SELECT -1 as e union Select 1 as e) a 
WHERE a.e=1 --(1) For ASC sort --(OR a.e=-1) For Desc Sort 
ORDER BY DATEDIFF(DAY, '2000-01-01', Arya.Datex)*a.e 


Result: ASC Sort IF 1 
1, 2015-06-22 
3, 2015-07-14 
2, 2015-08-17 

Result: ASC Sort IF -1 
2, 2015-08-17 
3, 2015-07-14 
1, 2015-06-22 
Смежные вопросы