SQL查询中的条件Where子句

Vel*_*elu 12 sql t-sql sql-server sql-server-2005

我已经开发了用于生成报告的MVC应用程序.我提供了很多搜索选项,如下所示

Customer id
Customer name
Customer E-mail
State
Country 
Run Code Online (Sandbox Code Playgroud)

用户1:

如果某些用户只给出一些值的输入

Customer id = 1
Customer name = A
Run Code Online (Sandbox Code Playgroud)

默认情况下,其他参数作为null传递给存储过程.

Customer E-mail
State
Country 
Run Code Online (Sandbox Code Playgroud)

用户2:

如果某些用户只给出一些值的输入

客户E-mail=xtz@gmail.com

默认情况下,其他参数作为null传递给存储过程.

Customer id
Customer name
State
Country 
Run Code Online (Sandbox Code Playgroud)

如何在存储过程中的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"
Run Code Online (Sandbox Code Playgroud)

请让我最好的方法.

谢谢,Velu

Dus*_*ine 11

如果您正在创建动态SQL,那么您可以像上面一样:

DECLARE @SQL NVARCHAR(MAX)
SELECT @SQL =  'SELECT * FROM TABLE '
if (@customerID IS NOT NULL)
    SQL = SQL + " AND customer_id = @customerID"
Run Code Online (Sandbox Code Playgroud)

或者另一个选择是像处理它一样

SELECT *
FROM TABLE
WHERE (@customerID IS NULL OR customer_id = @customerID)
Run Code Online (Sandbox Code Playgroud)

我更喜欢第二种,因为它使用的是参数化变量.第一个例子需要更加强烈地考虑恶意输入.

  • `我更喜欢第二个,因为它使用未优化的参数化变量`,请参阅 http://blogs.lessthandot.com/index.php/DataMgmt/DBProgramming/do-you-use-column-param-or-param-is- null 你可以使用 `sp_executesql` 来构建一个安全的字符串 (2认同)

Chr*_*sto 5

您可以执行动态SQL,但是更简单的方法是:

WHERE (ISNULL(@param1,1) = 1 OR [col1] = @param1)
    AND (ISNULL(@param2,1) = 1 OR [col2] = @param2)
    AND ...
Run Code Online (Sandbox Code Playgroud)

  • 然后,您使用该非“ SARGable”查询将索引冲洗到了厕所 (2认同)

Chr*_*ken 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();
Run Code Online (Sandbox Code Playgroud)