Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Consulta SQL dinâmica parametrizada


Você está fazendo algumas coisas erradas aqui:
  • Você dá a todos os seus parâmetros o mesmo nome @searchitem . Isso não vai funcionar. Os parâmetros precisam de nomes exclusivos.
  • Você cria um novo SqlCommand para cada item. Isso não vai funcionar. Crie o SqlCommand uma vez no início do loop e, em seguida, defina CommandText quando terminar de criar o SQL.
  • Seu SQL termina com AND , que não é uma sintaxe válida.

Sugestões de melhoria (não erradas em si, mas também não são as melhores práticas):
  • Como Frederik sugeriu, a maneira usual é colocar o % tokens no parâmetro, em vez de fazer a concatenação de strings dentro do SQL.
  • A menos que você use explicitamente um agrupamento que diferencia maiúsculas de minúsculas para seu banco de dados, as comparações não devem diferenciar maiúsculas de minúsculas. Assim, você pode não precisar do LOWER .

Exemplo de código:
SqlCommand cmd = new SqlCommand();
StringBuilder sqlBuilder = new StringBuilder();
sqlBuilder.Append("SELECT name, memberid FROM members ");

var i = 1;
foreach (string item in keywords)
{
    sqlBuilder.Append(i == 1 ? " WHERE " : " AND ");
    var paramName = "@searchitem" + i.ToString();
    sqlBuilder.AppendFormat(" Name LIKE {0} ", paramName); 
    cmd.Parameters.AddWithValue(paramName, "%" + item + "%");

    i++;
}
cmd.CommandText = sqlBuilder.ToString();