In my C# code I have the following piece of code that I am looking at converting into SQL in a stored procedure:
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); }
What I am trying to do is find a clean, easier way to make these “and” conditionals in C# fit into a SQL procedure without having to make 16 long difficult to read if and if else’s or a large amount of CASE statements to cover every single combination.
Maybe I am a victim of wishful thinking here, but I thought maybe I am missing something that would simplify this conversion. Thanks !
Advertisement
Answer
One possible solution might be to use CASE WHEN ELSE
in the WHERE
clause
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
This is not very sufficient on large tables but does what you need in just one query.
To call the procedure, use
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(); ... } }
To assign db NULL you can do
=(string.IsNullOrEmpty(s) ? (object)DBNull.Value : s); =(object)s ?? DBNull.Value;