Использование 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 + "%"