2017-04-11 37 views
1

多个值,我有三个下具有不同的值,如存储过程基于从下拉

第一类下拉

类别两个下拉

年下拉

我要搜索表搜索基于下拉值的产品表,它应根据下拉列表或所有下拉选定值中的任何一个过滤搜索结果。

让我们说,我有以下领域的产品表

ProductID 
ProductName 
ProductCatOne 
ProductCatTwo 
Description 
Image 
.... 
.... 

如何写一个存储过程,使我不能处理任何选择的三个值的最有效的方式。我想避免两个many如果存储过程语句

ALTER PROCEDURE [dbo].[sp_SearchProduct] 
    @ProductID int, 
    @ProductCatOne int, 
    @ProductCatTwo int 
AS 
BEGIN 
SET NOCOUNT ON; 

If @ProductID > 0 THEN 

END IF 


END 
MS SQL Server的

存储过程我不知道如何创建动态查询SP FR这里面搜索

回答

2

这就是所谓的Dynamic Search Conditions 。我建议你阅读Erland Sommarskog的这篇优秀文章。他解释了几种实现方法,以及如果不使用动态SQL,为什么需要OPTION(RECOMPILE),如下例所示。

几个笔记。

这是bad practice来命名您的存储过程的前缀sp_

我倾向于通过NULL值而不是0来指示应忽略此参数。 0值可以是搜索的有效值。

ALTER PROCEDURE [dbo].[SearchProduct] 
    @ProductID int, 
    @ProductCatOne int, 
    @ProductCatTwo int 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT 
     ... 
    FROM Products 
    WHERE 
     (ID = @ProductID OR @ProductID IS NULL) 
     AND (ProductCatOne = @ProductCatOne OR @ProductCatOne IS NULL) 
     AND (ProductCatTwo = @ProductCatTwo OR @ProductCatTwo IS NULL) 
    OPTION(RECOMPILE); 

END 

此代码假定列IDProductCatOneProductCatTwo不能有NULL值。

+0

我正好找这个..否则,我最终会做很多,如果条件。 SQL Server 2008提供了'OPTION(RECOMPILE)' – Learning

+0

是的,从SQL Server 2008开始就可以使用'OPTION(RECOMPILE)'(确保它是)。确保你已经应用了服务包。详情请参阅Erland的文章。 –

+0

我所有的值都是'Int'类型,但我可以通过空值为非选定的下拉 – Learning

1
ALTER PROCEDURE [dbo].[sp_SearchProduct] 
    @ProductID int, 
    @ProductCatOne int, 
    @ProductCatTwo int 
AS 
BEGIN 
SET NOCOUNT ON; 

    IF @ProductID ='' 
    SET @ProductID=NULL 

    IF @ProductCatOne ='' 
    SET @ProductCatOne=NULL 

    IF @ProductCatTwo ='' 
    SET @ProductCatTwo=NULL 

    SELECT * 
    FROM Product 
    WHERE ID = COALESCE (@ProductID,ID) 
      AND ProductCatOne =COALESCE (@ProductID,ProductCatOne) 
      AND ProductCatTwo=COALESCE (@ProductID,ProductCatTwo) 

END 
1
ALTER PROCEDURE [dbo].[SearchProduct] 
    @ProductID int, 
    @ProductName int, 
    @ProductCatOne int 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT 
     ... 
    FROM Products 
    WHERE 
    (Case When @ProductID <> 'ALL' Then ProductID Else @ProductID End) in(@ProductID) And 
    (Case When @ProductName <> 'ALL' Then ProductName Else @ProductName End) in(@ProductName) And 
    (Case When @ProductCatOne <> 'ALL' Then ProductCatOne Else @ProductCatOne End) in(@ProductCatOne) 


END