Использование SqlParameter в SQL LIKE не работает

У меня есть следующий код:

const string Sql = 
    @"select distinct [name] 
      from tblCustomers 
      left outer join tblCustomerInfo on tblCustomers.Id = tblCustomerInfo.CustomerId  
      where (tblCustomer.Name LIKE '%@SEARCH%' OR tblCustomerInfo.Info LIKE '%@SEARCH%');";

using (var command = new SqlCommand(Sql, Connection))
{       
    command.Parameters.AddWithValue("@SEARCH", searchString);
    ...
}

Это не работает, я тоже это пробовал:

const string Sql = 
    @"select distinct [name] 
     from tblCustomers 
     left outer join tblCustomerInfo on tblCustomers.Id = tblCustomerInfo.CustomerId  
     where (tblCustomer.Name LIKE @SEARCH OR tblCustomerInfo.Info LIKE @SEARCH );";

using (var command = new SqlCommand(Sql, Connection))
{       
    command.Parameters.AddWithValue("@SEARCH", "'%" + searchString + "%'");
    ...
}

но это не работает. Что происходит не так? Любые предложения?

Ответ 1

Что вы хотите:

tblCustomerInfo.Info LIKE '%' + @SEARCH + '%'

(или отредактируйте значение параметра, чтобы включить% в первую очередь).

В противном случае вы либо (первый образец), ищем буквенный "@SEARCH" (не значение arg), либо вставляете некоторые дополнительные кавычки в запрос (второй образец).

В некотором смысле, может быть проще иметь TSQL просто использовать LIKE @SEARCH и обрабатывать его у вызывающего:

command.Parameters.AddWithValue("@SEARCH","%" + searchString + "%");

Любой подход должен работать.

Ответ 2

Вместо использования:

const string Sql = 
@"select distinct [name] 
  from tblCustomers 
  left outer join tblCustomerInfo on tblCustomers.Id = tblCustomerInfo.CustomerId  
  where (tblCustomer.Name LIKE '%@SEARCH%' OR tblCustomerInfo.Info LIKE '%@SEARCH%');";

Используйте этот код:

const string Sql = 
@"select distinct [name] 
  from tblCustomers 
  left outer join tblCustomerInfo on tblCustomers.Id = tblCustomerInfo.CustomerId  
  where (tblCustomer.Name LIKE '%' + @SEARCH + '%' OR tblCustomerInfo.Info LIKE '%' + @SEARCH + '%');";

Ответ 3

Просто немного осторожнее с небольшой разницей между методами Add и AddWithValue. У меня была проблема ниже, когда я использовал метод Add и поставил неправильный параметр SqlType.

  • nchar и nvarchar могут хранить символы Unicode.
  • char и varchar не могут хранить символы Unicode.

Например:

string query = " ... WHERE stLogin LIKE @LOGIN ";

SqlParameter p = new SqlParameter("@LOGIN", SqlDbType.Char, 255) 
{ 
    Value = "%" + login + "%" 
};

command.Parameters.AddWithValue(p.ParameterName, p.Value); //works fine!!!

command.Parameters.Add(p); // won't work

Когда я изменил SqlType на NVarChar, оба метода работали нормально для меня.

SqlParameter p = new SqlParameter("@LOGIN", SqlDbType.NVarChar, 255) 
{ 
    Value = "%" + login + "%" 
};

command.Parameters.AddWithValue(p.ParameterName, p.Value); //worked fine!!!

command.Parameters.Add(p); //worked fine!!!

Ответ 4

Вы можете сделать LIKE @SEARCH и в своем коде на С# сделать

searchString = "%" + searchString + "%"