Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Query SQL dinamica parametrizzata

Stai sbagliando alcune cose qui:

  • Dai a tutti i tuoi parametri lo stesso nome @searchitem . Non funzionerà. I parametri necessitano di nomi univoci.
  • Crea un nuovo SqlCommand per ogni elemento. Non funzionerà. Crea SqlCommand una volta all'inizio del ciclo e poi imposta CommandText una volta terminata la creazione dell'SQL.
  • Il tuo SQL termina con AND , che non è una sintassi valida.

Suggerimenti di miglioramento (non sbagliati di per sé, ma nemmeno best practice):

  • Come suggerito da Frederik, il solito modo è mettere il % token nel parametro, anziché eseguire la concatenazione di stringhe all'interno dell'SQL.
  • A meno che tu non utilizzi esplicitamente regole di confronto con distinzione tra maiuscole e minuscole per il tuo database, i confronti dovrebbero essere senza distinzione tra maiuscole e minuscole. Pertanto, potresti non aver bisogno del LOWER .

Esempio di codice:

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