sql >> Base de Datos >  >> RDS >> Sqlserver

Consulta sql dinámica parametrizada

Estás haciendo algunas cosas mal aquí:

  • Le da a todos sus parámetros el mismo nombre @searchitem . Eso no funcionará. Los parámetros necesitan nombres únicos.
  • Usted crea un nuevo SqlCommand para cada elemento. Eso no funcionará. Cree el SqlCommand una vez al comienzo del ciclo y luego configure CommandText una vez que haya terminado de crear el SQL.
  • Tu SQL termina con AND , que no es una sintaxis válida.

Sugerencias de mejora (no incorrectas per se, pero tampoco mejores prácticas):

  • Como sugirió Frederik, la forma habitual es poner el % tokens en el parámetro, en lugar de hacer una concatenación de cadenas dentro del SQL.
  • A menos que utilice explícitamente una intercalación que distingue entre mayúsculas y minúsculas para su base de datos, las comparaciones no deben distinguir entre mayúsculas y minúsculas. Por lo tanto, es posible que no necesite el LOWER .

Ejemplo 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();