Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Параметризирана динамична sql заявка

Тук правите няколко неща грешно:

  • Давате на всички ваши параметри едно и също име @searchitem . Това няма да работи. Параметрите се нуждаят от уникални имена.
  • Създавате нова SqlCommand за всеки елемент. Това няма да работи. Създайте SqlCommand веднъж в началото на цикъла и след това задайте CommandText след като приключите със създаването на SQL.
  • Вашият SQL завършва с AND , което не е валиден синтаксис.

Предложения за подобрение (само по себе си не е грешно, но не и най-добра практика):

  • Както предложи Фредерик, обичайният начин е да поставите % токени в параметъра, вместо да прави конкатенация на низове вътре в SQL.
  • Освен ако изрично не използвате сортиране, чувствително към малки и главни букви за вашата база данни, сравненията не трябва да чувствителни към главни и малки букви. Следователно може да не се нуждаете от LOWER .

Пример за код:

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. Протоколите за мрежова конфигурация на Sql сървъра не са налични

  2. репликация между две таблици с различни имена и които имат различни имена на колони. Възможно ли е да се създаде такава репликация

  3. Как да стартирате съхранена процедура всеки ден в SQL Server Express Edition?

  4. Представяме ви нова функция - Отчет за растежа на облачната база данни на Spotlight

  5. SQL Server 2016:Създайте таблица