2012-07-30 63 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