Преобразование строки C# SQL в хранимую процедуру SQL - PullRequest
1 голос
/ 13 апреля 2020

В моем C# коде у меня есть следующий фрагмент кода, который я собираюсь преобразовать в SQL в хранимой процедуре:

StringBuilder sql = new StringBuilder("SELECT * FROM MyDatabase WHERE 1 = 1");

if (!string.IsNullOrEmpty(xzone))
{
    sql.AppendFormat(" AND xzone LIKE '{0}%'", xzone);
}

if (!string.IsNullOrEmpty(yregion))
{
    sql.AppendFormat(" AND yregion LIKE '{0}%'", yregion);
}

if (!string.IsNullOrEmpty(zzone))
{
    sql.AppendFormat(" AND zzone LIKE '{0}%'", zzone);
}

if (!string.IsNullOrEmpty(region))
{
    sql.AppendFormat(" AND region LIKE '{0}%'", region);
}

Что я пытаюсь сделать, это найти чистый более простой способ сделать эти "и" условными выражениями в C# вписанными в SQL процедуру без необходимости делать 16 длинных трудными для чтения, если и если или еще, или большое количество операторов CASE, чтобы охватить каждую отдельную комбинацию.

Возможно, я стал жертвой желаемого мышления, но я подумал, что, может быть, мне не хватает чего-то, что упростило бы это преобразование. Спасибо!

1 Ответ

0 голосов
/ 13 апреля 2020

Одним из возможных решений может быть использование CASE WHEN ELSE в предложении WHERE

CREATE PROCEDURE Proc1 (
    @xzone varchar(50),
    @yregion varchar(50),
    ... 
)
AS
BEGIN
   select *
   from MyDatabase
   where 
       xzone like '%' + case when @xzone is null then '' else @xzone end +'%'
   and 
       yregion like '%' + case when @yregion is null then '' else @yregion end +'%'
   and
       ...
END

Это недостаточно для больших таблиц, но выполняет то, что вам нужно, только в одном запросе.

Чтобы вызвать процедуру, используйте

using (SqlConnection con = new SqlConnection(...)) {
    using (SqlCommand cmd = new SqlCommand("Proc1", con)) {
      cmd.CommandType = CommandType.StoredProcedure; 
      cmd.Parameters.Add("@xzone", SqlDbType.VarChar).Value = ...;
      cmd.Parameters.Add("@yregion", SqlDbType.VarChar).Value = ...; 
      ...
      con.Open();
      SqlDataReader r = cmd.ExecuteReader();
      ...
    }
  }

. Чтобы присвоить dB NULL, вы можете сделать

=(string.IsNullOrEmpty(s) ? (object)DBNull.Value : s);
=(object)s ?? DBNull.Value;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...