Я хочу немного расширить ответ Джимми.
LASTNAME LIKE 'Pep%'
Это просто ЗЛО . НИКОГДА не делай этого. Вместо этого строка SQL должна выглядеть следующим образом:
LASTNAME LIKE @LastName + '%'
Теперь проблема в том, что в вашем случае вы не знаете, нужно ли вам вообще проверять фамилию. Все, что у вас есть, это предложения SELECT и FROM и текстовое поле для столбца фамилии, которое может иметь или не иметь значение в нем. Хорошо. Это все еще не оправдание для того, чтобы сделать это как в первом примере. Вместо этого вам нужно построить свой запрос следующим образом (используя C #, поскольку вы не указали язык клиента):
//create a place to keep parameters until we can construct the SqlCommand object
List<SqlParameter> params = new List<SqlParameter>();
SqlParameter p;
// the StringBuilder is MUCH more efficient the concatenating strings
// the 1=1 is a placeholder so you can always just append " AND whatever"
StringBuilder sql = new StringBuilder("SELECT ... \nFROM .... \nWHERE 1=1\n");
// Check and add a parameter for the LastName column if needed
if (!String.IsNullOrEmpty(txtLastName.Text))
{
sql.AppendLine("AND LASTNAME LIKE @LastName + '%'");
p = new SqlParameter("@LastName", SqlDbType.VarChar, 50); // use the actual datatype here
p.Value = txtLastName.Text;
params.Add(p);
}
// Check and add a parameter for another field if needed
if (!String.IsNullOrEmpty(txtSomeOtherField.Text))
{
sql.AppendLine("AND OtherField LIKE @OtherParam + '%'");
p = new SqlParameter("@OtherParam", SqlDbType.VarChar, 255);
p.Value = txtSomeOtherField.Text;
params.Add(p);
}
// ... You could also write a method to abstract the code in the if blocks ...
// you haven't told us _how_ the user will specify the order, so I'm leaving that implementation detail out for now
sql.Append(" ORDER BY LastName, OtherField");
// now we can finally get our SQL String and build the (SAFE!) SqlCommand object:
SqlCommand cmd = new SqlCommand(sql.ToString(), YourSqlConnectionObjectHere);
cmd.Parameters.AddRange(params.ToArray());
Теперь у вас есть динамически сгенерированное предложение where без возможности внедрения. Это работает, потому что каждая часть строки, отправляемая в базу данных, является точным литералом в вашем коде, даже если эти литералы собраны за несколько шагов. Значения, используемые в параметрах, никогда не подставляются в строку, а вместо этого отправляются на сервер отдельно в виде данных.
Конечно, это был C # (.Net), но почти на каждой современной платформе есть какая-то особенность параметризованного запроса / подготовленного оператора, которую вы должны использовать.