如何使用SQL查询使用注册日期列搜索网格视图

时间:2019-04-26 10:13:12

标签: c# sql asp.net sql-server-2008

如何使用日期列搜索网格视图?

在一个SQL Server数据库中,我有一个表Priority,其中有3列idnameregistered date。对于注册日期,默认值为getdate(),它将自动生成记录创建的日期和时间。现在在网格视图中,我想使用该注册日期搜索记录。在网格视图中,我使用名称和日期进行下拉搜索。

CREATE PROCEDURE [dbo].[SEARCHPRIOR]
    @SearchBy VARCHAR(50),
    @SearchVal VARCHAR(50),
AS
BEGIN
    IF @SearchBy = '1'
    BEGIN
        SELECT * 
        FROM PRIORITY 
        WHERE P_NAME LIKE '%' + @SearchVal + '%'
    END
    ELSE IF @SearchBy = '2'
    BEGIN
        SELECT * 
        FROM PRIORITY 
        WHERE P_TS LIKE '%' + @SearchVal + '%'
    END
    ELSE
    BEGIN
        SELECT * FROM PRIORITY 
    END
END

我尝试使用此查询进行搜索,但在网格视图中未找到任何结果。这是SQL Server中表格的外观:

P_ID     P_NAME    P_TS
-------------------------------------------
1        High      2019-04-23 16:17:08.097
2        Medium    2019-04-24 16:17:23.070                                                               
3        Low       2019-04-25 16:17:32.420

这就是我所谓的存储过程的名称,它可以正确搜索,但是带有日期,却没有找到结果。

public DataTable searchPRIOR(string searchBy, string searchVal)
{
    SqlCommand cmd = new SqlCommand("SEARCHPRIOR", con);
    cmd.CommandType = CommandType.StoredProcedure;

    cmd.Parameters.AddWithValue("@SearchBy", searchBy);
    cmd.Parameters.AddWithValue("@SearchVal", searchVal);

    SqlDataAdapter sda = new SqlDataAdapter(cmd);
    DataTable dt = new DataTable();
    sda.Fill(dt);

    return dt;
}

1 个答案:

答案 0 :(得分:0)

由于逗号悬空,您的存储过程将无法编译。

您的WHERE条件不能使用索引,因此没有理由在多个查询中拆分索引。

您可以考虑将逻辑编写为:

CREATE PROC [dbo].[SEARCHPRIOR] (
    @SearchBy   varchar(50),
    @SearchVal  varchar(50)
) AS
BEGIN
    SELECT P.*
    FROM PRIORITY P
    WHERE (@SearchBy = '1' AND P_NAME like '%' + @SearchVal + '%') OR
          (@SearchBy = '2' AND P_TS like '%' + @SearchVal + '%') OR
          (COALESCE(@SearchBy, '') NOT IN ('1', '2'));
END;

我不知道简化代码是否可以解决您的问题。 SP的调用方式(未定义)可能是个问题。