2012-07-30 52 views
1

我有一列包含許多行。我正在將一個值列表傳遞給一個方法。我希望返回此列的子字符串包含我正在查找的值的所有行。檢查SQL查詢中的多個子字符串

目前,我正在使用CHARINDEX檢查單個子字符串,並在每個後續子字符串上追加OR CHARINDEX。這很雜亂,我相信你可以欣賞。

所以,此刻,我有:

[Long SQL query]... 
queryString.Append(string.Format(" (AND CHARINDEX('{0}', Table.Column) > 0 ", ListOfValues[0])); 
      foreach (string value in ListOfValues) 
      { 
       queryString.Append(string.Format("OR CHARINDEX('{0}', Table.Column) > 0 ", value)); 
      } 

      queryString.Append(string.Format(")AND CHARINDEX('{0}', Table.Column) > 0)")); 

queryString.Append(")"); 

有較少語法可怕的方式做到這一點? :)

謝謝

+1

你最後一次添加意味着什麼?它似乎是一個佔位符,但沒有參數調用格式,我不知道它應該做什麼... – Chris 2012-07-30 09:54:05

+0

對不起,複製粘貼錯誤:) – 2012-07-30 10:15:24

+0

您應該可以更新您的帖子來更正有問必答的問題。 – Chris 2012-07-30 13:54:43

回答

0

首先,將字符串放入類似的SQL查詢中,非常危險!如果您不注意,那麼您將打開您的應用程序以進行SQL注入http://en.wikipedia.org/wiki/SQL_injection

現在到了答案:

queryString.Append(string.Format(" Table.Column LIKE '%{0}%' ", ListOfValues[0])); 

爲了避免SQL注入,而不是嘗試這樣做:

command.Parameters.AddWithValue("@ParamX","%" + value + "%"); 

正如我們在這裏做字符串比較,我想不出的用SQL服務器處理它的方式不那麼麻煩。

1

如果我明白了這個問題,那麼你可以更容易地在SQL方面做到這一點。

Select MyColumn 
From MyTable 
Where MyColumn Like '%MySubstringText%' 

顯然,如果您的子字符串將要更改,您需要動態創建SQL語句。

編輯:

如果你已經多個可能子,那麼你可以填充值列表中選擇一個表,然後交叉連接使用CHARINDEX兩個表和篩選器。

Create table MySubstrings 
(
    MySubstring nvarchar(100) not null 
) 


Select t.MyColumn 
From MyTable t, MySubstrings s 
Where CharIndex(s.MySubstring, t.MyColumn) > 0 

雖然表現可能不是很好。

+0

'Like'可能在語法上比'charindex'更少,但是你仍然需要循環和'this,this或者這個......'的長集合。' – Chris 2012-07-30 09:55:07

+0

非常正確 - 我會誤解這個問題。 – 2012-07-30 10:00:34

+0

我已經編輯了答案來處理多個值的可能性。 – 2012-07-30 10:10:19