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
。我真的很感谢你指导我:)