Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Sparametryzowane dynamiczne zapytanie sql

Robisz tu kilka rzeczy źle:

  • Nadajesz wszystkim swoim parametrom tę samą nazwę @searchitem . To nie zadziała. Parametry wymagają unikalnych nazw.
  • Tworzysz nową SqlCommand dla każdego elementu. To nie zadziała. Utwórz SqlCommand raz na początku pętli, a następnie ustaw CommandText po zakończeniu tworzenia SQL.
  • Twój SQL kończy się na AND , co jest nieprawidłową składnią.

Propozycje ulepszeń (nie są złe per se, ale też nie są najlepszymi praktykami):

  • Jak zasugerował Frederik, zwykłym sposobem jest umieszczenie % tokeny w parametrze, zamiast wykonywać konkatenację ciągów wewnątrz SQL.
  • O ile nie używasz jawnie sortowania z rozróżnianiem wielkości liter w bazie danych, porównania nie powinny uwzględniać wielkości liter. Dlatego możesz nie potrzebować LOWER .

Przykład kodu:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy klucz podstawowy jest niezbędny w SQL Server?

  2. „CREATE VIEW” musi być pierwszą instrukcją w partii zapytania

  3. Wybierz wiersze nie w innej tabeli, zapytanie SQL Server

  4. SQL Server 2014:natywne szyfrowanie kopii zapasowych

  5. Jak wykryć, czy wartość zawiera co najmniej jedną liczbę w SQL Server?