Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Requête sql dynamique paramétrée

Vous faites quelques erreurs ici :

  • Vous donnez à tous vos paramètres le même nom @searchitem . Cela ne fonctionnera pas. Les paramètres doivent avoir des noms uniques.
  • Vous créez un nouveau SqlCommand pour chaque élément. Cela ne fonctionnera pas. Créez le SqlCommand une fois au début de la boucle, puis définissez CommandText une fois que vous avez fini de créer le SQL.
  • Votre SQL se termine par AND , qui n'est pas une syntaxe valide.

Suggestions d'amélioration (pas fausses en soi, mais pas non plus les meilleures pratiques) :

  • Comme Frederik l'a suggéré, la manière habituelle est de mettre le % jetons dans le paramètre, plutôt que de concaténer des chaînes dans le SQL.
  • Sauf si vous utilisez explicitement un classement sensible à la casse pour votre base de données, les comparaisons doivent être insensibles à la casse. Ainsi, vous n'aurez peut-être pas besoin du LOWER .

Exemple de code :

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