Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Parametrisierte dynamische SQL-Abfrage

Du machst hier ein paar Dinge falsch:

  • Sie geben allen Ihren Parametern denselben Namen @searchitem . Das wird nicht funktionieren. Die Parameter brauchen eindeutige Namen.
  • Sie erstellen für jedes Element einen neuen SqlCommand. Das wird nicht funktionieren. Erstellen Sie den SqlCommand einmal am Anfang der Schleife und dann CommandText setzen sobald Sie mit der Erstellung der SQL fertig sind.
  • Ihr SQL endet mit AND , was keine gültige Syntax ist.

Verbesserungsvorschläge (nicht per se falsch, aber auch kein Best Practice):

  • Wie Frederik vorgeschlagen hat, ist der übliche Weg, den % zu setzen Tokens im Parameter, anstatt eine String-Verkettung innerhalb von SQL durchzuführen.
  • Wenn Sie für Ihre Datenbank nicht ausdrücklich eine Sortierung mit Berücksichtigung der Groß-/Kleinschreibung verwenden, sollte bei Vergleichen die Groß-/Kleinschreibung nicht beachtet werden. Daher brauchen Sie den LOWER möglicherweise nicht .

Codebeispiel:

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