在ADO.NET中參數化order by clause的正確方法是什麼?在SQL中參數化'order by'
有時需要按2列進行排序,而默認情況下僅排列1列,有時您只想將ASC更改爲DEC。 在這種情況下使用字符串連接是否正確(假設輸入不是直接來自用戶,而是代碼中或多或少硬編碼值的查找)
在ADO.NET中參數化order by clause的正確方法是什麼?在SQL中參數化'order by'
有時需要按2列進行排序,而默認情況下僅排列1列,有時您只想將ASC更改爲DEC。 在這種情況下使用字符串連接是否正確(假設輸入不是直接來自用戶,而是代碼中或多或少硬編碼值的查找)
SQL注入純粹主義者會告訴你的字符串連接是不允許的,因爲總是存在另一個程序員可能擴展程序並將SQL語句暴露給外部世界的可能性。但是,如果這些值是硬編碼的(即作爲常量),並且永遠不會看到外部世界,那麼是的,連接它是完全可以的。
只要用戶不被允許通過文本輸入或可能通過url訪問變量,我沒有看到使用字符串連接的任何負面原因。除非像下面的人說的那樣,該程序可以由不同的用戶進行擴展,而不是那種「注射意識」。
有純粹的T-SQL解決方案不使用動態SQL。
一些答案在這裏:Dynamic order direction。接受的答案和我的答案展示了2種方法。雖然也許SQL Server特定。
如果不是這麼多的數據,我只想有:
DataTable dt = ....
DataView dv = new DataView(dt);
dv.Sort = "LastName DESC, FistName";
,然後改變無論基於何種最後一行。
嘗試這樣的:
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,那麼你得到前兩個選項的恆定值。
所以使用這個,你可以很容易地有一些選項,讓你按幾個字段排序,或降序,或任何你想要的。
羅布
樣品:
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
這會工作,但你有時想要做什麼@ Sortby1和有時@ Sortby1,@ Soryby2 - 只是一些字符串操作? – nos 2009-07-31 21:31:57