2010-08-04 93 views
2

我有一個ASP.NET應用程序需要使用列表和範圍搜索VARCHAR(20)列。換句話說,該輸入可以是這樣的:搜索列表,範圍

ABC,444,CD-EF,90-BA,HIJ 

,結果需要是相當於:

SELECT * FROM table 
WHERE 
    Col1 = 'ABC' OR 
    Col1 = '444' OR 
    Col1 BETWEEN 'CD' AND 'EF' OR 
    Col1 BETWEEN '90' AND 'BA' OR 
    Col1 = 'HIJ' 

常規SQL列的排序順序是針對範圍是可接受的。這裏涉及兩個主要部分:

  1. 將參數從.NET發送到存儲過程。
  2. 使用SP中的參數進行搜索。

我已經考慮一些選擇,這不是相互排斥的:

  1. 的是,我可以發送字符串。沒有array[] = SPLIT(',', @query)或類似的,所以解析將是低水平的。我寧願在.NET端解析。
  2. 在.NET端,轉換爲XML,在SP中轉換爲表。
  3. 使用遊標瀏覽已經在表中的參數,執行單獨的查詢併合並結果。
  4. 創建動態where子句(SQL上側的1號,或.NET的一側)

動態在.NET端SQL似乎「易」的出路,但我不相信這是最好的。有什麼想法嗎?

回答

1

我認爲在.NET端創建SQL語句不僅僅是簡單的方法。 SQL在執行set-base操作(例如,運行SELECT語句)時性能最佳。在進行程序編碼時,SQL不是最好的選擇。

在解決除了在.NET上創建動態SQL之外的每個選項時,您都會要求SQL執行程序性任務。

既然你可以讓.NET做程序的東西,而SQL Server做基於集合的東西,那就是要走的路。

+0

我最終這樣做了。保持它的服務器端增加了一點可重用性,但這項工作的價值可以忽略不計。 – 2010-08-25 19:41:48

1

爲了在SQL Server中實現這一點,您需要將字符串/ VARCHAR拆分爲臨時表,然後可以使用該臨時表對JOIN進行過濾目標表。

查看這篇關於使用編碼輸入構建查詢的出色MSDN文章。包括拆分字符分隔VARCHAR處理SQL函數:

http://code.msdn.microsoft.com/SQLExamples/Wiki/View.aspx?title=StringArrayInput&referringTitle=Home

這將很好地工作平等比較 - 操作之間將是棘手的落實。鑑於SQL字符串操作與C#相比的侷限性,我最終會在C#中實現這一點。

+0

+1爲SQL端,但我最終沒有使用這個。例如, – 2010-08-25 19:37:13

2

如何在C#中創建SQL語句?這意味着你可以控制你的輸入字符串,這樣你就不容易受到SQL注入攻擊。

string para = "ABC,444,CD-EF,90-BA,HIJ"; 
StringBuilder sb = new StringBuilder("SELECT * FROM table WHERE "); 
List<string> queries = new List<string>(); 
foreach (var part in para.Split(',')) 
{ 
    if (part.Contains("-")) 
    { 
     var between = part.Split('-'); 
     queries.Add(string.Format("Col1 BETWEEN '{0}' AND '{1}'", between[0], between[1])); 
    } 
    else 
    { 
     queries.Add(string.Format("Col1 = '{0}'", part)); 
    } 
} 
sb.Append(string.Join(" OR ", queries.ToArray())); 
string sql = sb.ToString(); 
+0

+1,但我已經提到過這個選項,並知道如何去做。 – 2010-08-25 19:40:49