2009-07-31 20 views
4

在ADO.NET中參數化order by clause的正確方法是什麼?在SQL中參數化'order by'

有時需要按2列進行排序,而默認情況下僅排列1列,有時您只想將ASC更改爲DEC。 在這種情況下使用字符串連接是否正確(假設輸入不是直接來自用戶,而是代碼中或多或少硬編碼值的查找)

回答

2

SQL注入純粹主義者會告訴你的字符串連接是不允許的,因爲總是存在另一個程序員可能擴展程序並將SQL語句暴露給外部世界的可能性。但是,如果這些值是硬編碼的(即作爲常量),並且永遠不會看到外部世界,那麼是的,連接它是完全可以的。

+0

這會工作,但你有時想要做什麼@ Sortby1和有時@ Sortby1,@ Soryby2 - 只是一些字符串操作? – nos 2009-07-31 21:31:57

0

只要用戶不被允許通過文本輸入或可能通過url訪問變量,我沒有看到使用字符串連接的任何負面原因。除非像下面的人說的那樣,該程序可以由不同的用戶進行擴展,而不是那種「注射意識」。

0

有純粹的T-SQL解決方案不使用動態SQL。

  • 預SQL 2005,你不得不使用情況下,在ORDER BY
  • SQL 2005後,您可以使用ROW_NUMBER等

一些答案在這裏:Dynamic order direction。接受的答案和我的答案展示了2種方法。雖然也許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, 
    ... 

的想法是,每個CASE語句將計算爲NULL,如果WHEN不匹配。所以,如果你把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 

現在,參數多態在選擇排序(基礎上德恩域)....

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