我开发了用于生成报告的MVC应用程序。我提供了许多搜索选项,如下所示
Customer id
Customer name
Customer E-mail
State
Country
用户1:
如果某些用户仅为某些值提供输入,例如
Customer id = 1
Customer name = A
默认情况下,其他参数作为null传递给存储过程。
Customer E-mail
State
Country
用户2:
如果某些用户仅为某些值提供输入,例如
客户E-mail=xtz@gmail.com
默认情况下,其他参数作为null传递给存储过程。
Customer id
Customer name
State
Country
如何在存储过程中的SQL查询中使用where子句。我们可以像下面这样做吗
string qry = select * from table_name where status != d
if (@customerID!=null)
qry = qry + "and customer_id=@customerID"
if (@customerName!=null)
qry = qry + "and customer_name=@customerName"
请告诉我最好的方法。
谢谢, Velu
答案 0 :(得分:10)
如果您正在创建动态SQL,那么您可以像上面那样做:
DECLARE @SQL NVARCHAR(MAX)
SELECT @SQL = 'SELECT * FROM TABLE '
if (@customerID != null)
SQL = SQL + " AND customer_id = @customerID"
或者另一种选择是像
那样处理它SELECT *
FROM TABLE
WHERE (customerID IS NULL OR customer_id = @customerID)
我更喜欢第二种,因为它使用的是参数化变量。第一个例子需要更加强烈地考虑恶意输入。
答案 1 :(得分:3)
您可以执行动态SQL,但更简单的方法是:
WHERE (ISNULL(@param1,1) = 1 OR [col1] = @param1)
AND (ISNULL(@param2,1) = 1 OR [col2] = @param2)
AND ...
答案 2 :(得分:0)
你必须将所有变量作为参数传递给SP,然后在那里做你的逻辑。
SqlCommand cmd = new SqlCommand("STORED_PROC_NAME", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@CustomerID", custId));
var rdr = cmd.ExecuteReader();