Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于SQL Server存储过程网页中的下拉值筛选数据_C#_Sql_Sql Server_Sql Server 2008_Stored Procedures - Fatal编程技术网

C# 基于SQL Server存储过程网页中的下拉值筛选数据

C# 基于SQL Server存储过程网页中的下拉值筛选数据,c#,sql,sql-server,sql-server-2008,stored-procedures,C#,Sql,Sql Server,Sql Server 2008,Stored Procedures,我想根据产品类别、产品子类别和年份筛选项目的数据。我有三个下拉列表,分别是ProductCategory、ProductSubCategory和YEAR,根据用户选择,我希望显示数据 用户可以根据任何下拉选择筛选数据,id用户不选择任何内容,默认情况下,它应该显示所有记录 我需要编写一个包含3个参数的存储过程,以使其正常工作,有人建议我使用以下查询 SELECT * FROM Products WHERE (CatID = 0 OR CatID IS NULL) AND (CatSu

我想根据
产品类别
产品子类别
年份
筛选
项目
的数据。我有三个下拉列表,分别是
ProductCategory
ProductSubCategory
YEAR
,根据用户选择,我希望显示数据

用户可以根据任何下拉选择筛选数据,id用户不选择任何内容,默认情况下,它应该显示所有记录

我需要编写一个包含3个参数的存储过程,以使其正常工作,有人建议我使用以下查询

SELECT *    
FROM Products
WHERE (CatID = 0 OR CatID IS NULL)
  AND (CatSubID = 0 OR CatSubID IS NULL)
  AND (DATEPART(YY, PubDate) = 0 OR DATEPART(YY, PubDate) IS NULL)
这个查询的问题是我没有
Null
值,如果它没有分配给任何类别或子类别,并且年份部分从不为Null或
0
,则数据库中有0,即使我将
0
更改为Null,如果不选择任何下拉列表中的值,它仍然不会获取任何内容

CatID
&
CatSubID
列中的
0
表示未将其分配给任何类别,因此我们可以说
0
是这些产品的通用类别

产品
数据:

ID  Title       PubDate         Visible     CatID   CatSubID
------------------------------------------------------------
1   Title 1     2016-11-07      1           7       5
2   Title 2     2012-12-31      1           0       0
3   Title 3     2016-12-19      0           5       0
4   Title 4     2014-11-07      1           7       5
5   Title 5     2015-12-19      1           7       5
6   Title 6     2016-12-19      0           7       5
示例1:CatID=7,CatSubID=5,年份=2016

结果:

ID  Title       PubDate         Visible     CatID   CatSubID
------------------------------------------------------------
1   Title 1     2016-11-07      1           7       5
6   Title 6     2016-12-19      0           7       5
ID  Title       PubDate         Visible     CatID   CatSubID
------------------------------------------------------------
1   Title 1     2016-11-07      1           7       5
4   Title 4     2014-11-07      1           7       5
5   Title 5     2015-12-19      1           7       5
6   Title 6     2016-12-19      0           7       5
1   Title 1     2016-11-07      1           7       5
4   Title 4     2014-11-07      1           7       5
5   Title 5     2015-12-19      1           7       5
6   Title 6     2016-12-19      0           7       5
示例2:CatID=7,CatSubID=0,年份=0

结果:

ID  Title       PubDate         Visible     CatID   CatSubID
------------------------------------------------------------
1   Title 1     2016-11-07      1           7       5
6   Title 6     2016-12-19      0           7       5
ID  Title       PubDate         Visible     CatID   CatSubID
------------------------------------------------------------
1   Title 1     2016-11-07      1           7       5
4   Title 4     2014-11-07      1           7       5
5   Title 5     2015-12-19      1           7       5
6   Title 6     2016-12-19      0           7       5
1   Title 1     2016-11-07      1           7       5
4   Title 4     2014-11-07      1           7       5
5   Title 5     2015-12-19      1           7       5
6   Title 6     2016-12-19      0           7       5
示例3:CatID=0,CatSubID=5,年份=0

结果:

ID  Title       PubDate         Visible     CatID   CatSubID
------------------------------------------------------------
1   Title 1     2016-11-07      1           7       5
6   Title 6     2016-12-19      0           7       5
ID  Title       PubDate         Visible     CatID   CatSubID
------------------------------------------------------------
1   Title 1     2016-11-07      1           7       5
4   Title 4     2014-11-07      1           7       5
5   Title 5     2015-12-19      1           7       5
6   Title 6     2016-12-19      0           7       5
1   Title 1     2016-11-07      1           7       5
4   Title 4     2014-11-07      1           7       5
5   Title 5     2015-12-19      1           7       5
6   Title 6     2016-12-19      0           7       5
示例4:CatID=0,CatSubID=0,年份=0

结果:在这种情况下,它应该显示表中的所有记录

希望这能起作用

DECLARE @CatID    INT=0, 
        @CatSubID INT=0, 
        @YEAR     INT=0 

SELECT * 
FROM   #your_table 
WHERE  ( catid = CASE 
                   WHEN @CatID = 0 THEN catid 
                   ELSE @CatID 
                 END ) 
       AND ( catsubid = CASE 
                          WHEN @CatSubID = 0 THEN catsubid 
                          ELSE @CatSubID 
                        END ) 
       AND ( Year(pubdate) = CASE 
                               WHEN @YEAR = 0 THEN Year(pubdate) 
                               ELSE @YEAR 
                             END ) 

我想你想要这个-如果其中一个参数为零,你跳过该参数的OR子句的后半部分-你忽略它,换句话说

CREATE PROCEDURE procProducts
@catid INT,
@catsubid INT,
@year INT
AS
BEGIN

SELECT  *    
FROM Products
WHERE (@CatID = 0 OR @CatID = CatID)
AND (@CatSubID = 0 OR @CatSubID = CatSubID)
AND (@year = 0 OR @year = DATEPART(YY,PubDate))

END
GO

exec procProducts 0, 0, 0

考虑到您的上述查询,您可以使用简单的解决方案:

CREATE TABLE [dbo].[MyTable](
    [ID] [int] NULL,
    [Title] [nvarchar](250) NULL,
    [PubDate] [datetime] NULL,
    [Visible] [bit] NULL,
    [CatID] [int] NULL,
    [CatSubID] [int] NULL
) ON [PRIMARY]

GO
如果上面的表结构是正确的,那么为什么不使用下面的简化查询呢

    create procedure Filter
        @CatID int
        ,@CatSubID int
        ,@Year int
    as
    begin
        select * from MyTable
        where CatID=@CatID and CatSubID=@CatSubID and year(PubDate)=@Year
    end

我以前试过这个但没有得到正确的数据你确定吗?我很确定它是有效的。。。无论如何,输出与您的所有示例案例都匹配。是的,我错了,它似乎起作用了,让我检查所有条件。我只想提到您的查询作为查询工作,但当我将此作为存储过程时,如果我将0值传递给year,则它不起作用。虽然
@PP006
给出的解决方案运行良好,但我不确定为什么您的查询不起作用work@Learning它在存储过程中绝对有效。请参阅编辑-我将原始答案包装在CREATEPROCEDURE语句中。工作起来很有魅力。
PubDate
真的应该是一个
DATE
DATETIME2(n)
列-不要因为懒散而把所有东西都存储起来。。。。。。另外:像
Year
这样的参数很可能更多地是一个数值——因此您应该使用
INT
——再次强调:不要将所有内容都设置为
varchar
,因为这样可以省去您对数据类型的思考。。。。您应该始终使用最合适的数据类型!现在检查!感谢您的知识:)但是如果表中的
CatId
CatSubId
列是
INT
,那么
Filter
存储过程的参数也应该是
INT
。我真的很感谢你指导我:)