Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.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
Search SQL Server 2008 R2-在同一列上搜索具有多个可为空参数的表_Search_Sql Server 2008 R2 - Fatal编程技术网

Search SQL Server 2008 R2-在同一列上搜索具有多个可为空参数的表

Search SQL Server 2008 R2-在同一列上搜索具有多个可为空参数的表,search,sql-server-2008-r2,Search,Sql Server 2008 R2,我正在开发一个搜索工具,我需要使用最多6个搜索参数搜索一个表,问题是,6个参数中的5个需要搜索同一列 我正在搜索一个从item_category表填充的临时表,这个临时表有3列,item、item_desc和cat_desc。第一个搜索参数是@desc,这个参数将搜索item_desc列,其他5个参数是@P1、@P2、@P3、@P4和@P5,都是nvarchar40类型。这些@P参数都需要搜索cat_desc列 下面是使用示例数据创建临时表的代码,以及我迄今为止的查询代码。我试图用注释解释每个部

我正在开发一个搜索工具,我需要使用最多6个搜索参数搜索一个表,问题是,6个参数中的5个需要搜索同一列

我正在搜索一个从item_category表填充的临时表,这个临时表有3列,item、item_desc和cat_desc。第一个搜索参数是@desc,这个参数将搜索item_desc列,其他5个参数是@P1、@P2、@P3、@P4和@P5,都是nvarchar40类型。这些@P参数都需要搜索cat_desc列

下面是使用示例数据创建临时表的代码,以及我迄今为止的查询代码。我试图用注释解释每个部分,我将在下面的代码中解释我需要它做什么

-- Create Temp Tables --
CREATE TABLE #Item_Category_List(
        item        nvarchar(30)
        ,item_desc  nvarchar(40)
        ,cat_desc   nvarchar(40));

-- Populate #Item_Category_List with sample data
INSERT #Item_Category_List(item, item_desc, cat_desc)
VALUES ('2-77132', '2-77132 P1812-24-120', 'Keypad PB Controls W/Variable Speed')
    ,('2-77132', '2-77132 P1812-24-120', '60 Hertz')
    ,('2-77132', '2-77132 P1812-24-120', '1 x 3.00HP Motor')
    ,('2-77132', '2-77132 P1812-24-120', 'Light Curtain Option')
    ,('2-77132', '2-77132 P1812-24-120', 'Bin Detection Option')
    ,('2-77132', '2-77132 P1812-24-120', '3 Phase')
    ,('2-77132', '2-77132 P1812-24-120', '480 Volts')
    ,('2-70470', 'CANTILEVER-CRSL-C20243-3912-194', 'Vidir Inventory Control Software')
    ,('2-70470', 'CANTILEVER-CRSL-C20243-3912-194', '60 Hertz')
    ,('2-70470', 'CANTILEVER-CRSL-C20243-3912-194', 'SEW Motor')
    ,('2-70470', 'CANTILEVER-CRSL-C20243-3912-194', '3 Phase')
    ,('2-70470', 'CANTILEVER-CRSL-C20243-3912-194', '460 Volts')
    ,('2-77562', 'HT54193-0663-12-RAMP', 'Keypad PB Controls W/Variable Speed')
    ,('2-77562', 'HT54193-0663-12-RAMP', '60 Hertz')
    ,('2-77562', 'HT54193-0663-12-RAMP', 'Top Right Side Front Location')
    ,('2-77562', 'HT54193-0663-12-RAMP', '2 x 2.00HP Motor')
    ,('2-77562', 'HT54193-0663-12-RAMP', '3 Phase')
    ,('2-77562', 'HT54193-0663-12-RAMP', '208 Volts')
    ,('2-76559', 'R20116-1416-4M 2-HAND CONTROLS', '2 Hand Security Control')
    ,('2-76559', 'R20116-1416-4M 2-HAND CONTROLS', 'Keypad PB Controls')
    ,('2-76559', 'R20116-1416-4M 2-HAND CONTROLS', '50 Hertz')
    ,('2-76559', 'R20116-1416-4M 2-HAND CONTROLS', 'Right Side Front Location')
    ,('2-76559', 'R20116-1416-4M 2-HAND CONTROLS', '1 x 1.50HP Motor')
    ,('2-76559', 'R20116-1416-4M 2-HAND CONTROLS', '1 Phase')
    ,('2-76559', 'R20116-1416-4M 2-HAND CONTROLS', '220 Volts')
    ,('2-73432', 'R20116-1614-06', 'PB Controls')
    ,('2-78125', 'R20116-1614-06', 'PB Controls')
    ,('2-74803', 'R20116-1614-06', 'PB Controls Dual W/Selector and Beeper')
    ,('2-78125', 'R20116-1614-06', '50 Hertz')
    ,('2-74803', 'R20116-1614-06', '50 Hertz')
    ,('2-73432', 'R20116-1614-06', '60 Hertz')
    ,('2-73432', 'R20116-1614-06', 'Right Side Front and Back Location')
    ,('2-74803', 'R20116-1614-06', 'Right Side Front and Back Location')
    ,('2-78125', 'R20116-1614-06', 'Right Side Front Location')
    ,('2-78125', 'R20116-1614-06', '1 x 1.50HP Motor')
    ,('2-73432', 'R20116-1614-06', '1 x 1.50HP Motor')
    ,('2-74803', 'R20116-1614-06', '1 x 1.50HP Motor')
    ,('2-74803', 'R20116-1614-06', 'Pigtail, Top Option')
    ,('2-74803', 'R20116-1614-06', '1 Phase')
    ,('2-78125', 'R20116-1614-06', '1 Phase')
    ,('2-73432', 'R20116-1614-06', '3 Phase')
    ,('2-74803', 'R20116-1614-06', '110 Volts')
    ,('2-78125', 'R20116-1614-06', '208 Volts')
    ,('2-73432', 'R20116-1614-06', '480 Volts')
    ,('2-76582', 'R20116-1614-09', 'PB Controls')
    ,('2-76582', 'R20116-1614-09', '60 Hertz')
    ,('2-76582', 'R20116-1614-09', 'Right Side Front and Back Location')
    ,('2-76582', 'R20116-1614-09', '2 x 1.50HP Motor')
    ,('2-76582', 'R20116-1614-09', '3 Phase')
    ,('2-76582', 'R20116-1614-09', '220 Volts')
    ,('2-59350', 'R20116-1614-12-STD-CNTRLS', 'Keypad PB Controls')
    ,('2-59350', 'R20116-1614-12-STD-CNTRLS', '60 Hertz')
    ,('2-59350', 'R20116-1614-12-STD-CNTRLS', 'Right Side Front Location')
    ,('2-59350', 'R20116-1614-12-STD-CNTRLS', '1 x 1.50HP Motor')
    ,('2-59350', 'R20116-1614-12-STD-CNTRLS', '3 Phase')
    ,('2-59350', 'R20116-1614-12-STD-CNTRLS', '220 Volts')
    ,('2-77592', 'R20158-2214-06', 'PB Controls Dual W/Selector and Beeper')
    ,('2-77592', 'R20158-2214-06', '60 Hertz')
    ,('2-77592', 'R20158-2214-06', 'Right Side Front and Back Location')
    ,('2-77592', 'R20158-2214-06', '2 x 1.00HP Motor')
    ,('2-77592', 'R20158-2214-06', '3 Phase')
    ,('2-77592', 'R20158-2214-06', '208 Volts')
    ,('2-48924', 'R20179-2514-12', 'Keypad PB Controls')
    ,('2-48924', 'R20179-2514-12', '60 Hertz')
    ,('2-48924', 'R20179-2514-12', 'Right Side Front and Back Location')
    ,('2-48924', 'R20179-2514-12', '1 x 1.50HP Motor')
    ,('2-48924', 'R20179-2514-12', '3 Phase')
    ,('2-48924', 'R20179-2514-12', '208 Volts')
    ,('2-70697', 'R20228-3214-06', 'PB Controls')
    ,('2-70697', 'R20228-3214-06', '60 Hertz')
    ,('2-70697', 'R20228-3214-06', 'Right Side Front Location')
    ,('2-70697', 'R20228-3214-06', '2 x 1.00HP Motor')
    ,('2-70697', 'R20228-3214-06', '3 Phase')
    ,('2-70697', 'R20228-3214-06', '208 Volts')
    ,('2-76637', 'R24125-1220-06-DC 2-76637', 'PB Controls Dual W/Selector and Beeper')
    ,('2-76637', 'R24125-1220-06-DC 2-76637', '60 Hertz')
    ,('2-76637', 'R24125-1220-06-DC 2-76637', 'Top Right Side Front and Back Location')
    ,('2-76637', 'R24125-1220-06-DC 2-76637', '3 Phase')
    ,('2-76637', 'R24125-1220-06-DC 2-76637', '208 Volts')
    ,('2-76965', 'R39150-MS-06-DC 2-76965', 'PB Controls')
    ,('2-76965', 'R39150-MS-06-DC 2-76965', '60 Hertz')
    ,('2-76965', 'R39150-MS-06-DC 2-76965', 'Left Side Front and Back Location')
    ,('2-76965', 'R39150-MS-06-DC 2-76965', '2 x 1.00HP Motor')
    ,('2-76965', 'R39150-MS-06-DC 2-76965', '3 Phase')
    ,('2-76965', 'R39150-MS-06-DC 2-76965', '208 Volts')
    ,('2-76909', 'SMALL WIRE CRSL R24159-1422-52', 'Keypad PB Controls')
    ,('2-76909', 'SMALL WIRE CRSL R24159-1422-52', '60 Hertz')
    ,('2-76909', 'SMALL WIRE CRSL R24159-1422-52', 'Right Side Front Location')
    ,('2-76909', 'SMALL WIRE CRSL R24159-1422-52', '1 x 1.00HP Motor')
    ,('2-76909', 'SMALL WIRE CRSL R24159-1422-52', '3 Phase')
    ,('2-76909', 'SMALL WIRE CRSL R24159-1422-52', '208 Volts')
    ,('2-54416', 'T39148-0740-15', 'Keypad PB Controls')
    ,('2-54416', 'T39148-0740-15', '60 Hertz')
    ,('2-54416', 'T39148-0740-15', 'Right Side Front Location')
    ,('2-54416', 'T39148-0740-15', '2 x 1.50HP Motor')
    ,('2-54416', 'T39148-0740-15', '3 Phase')
    ,('2-54416', 'T39148-0740-15', '208 Volts')
    ,('2-56095', 'T39188-0940-15-SV', 'Keypad PB Controls')
    ,('2-56095', 'T39188-0940-15-SV', '60 Hertz')
    ,('2-56095', 'T39188-0940-15-SV', 'Right Side Front Location')
    ,('2-56095', 'T39188-0940-15-SV', '2 x 1.50HP Motor')
    ,('2-56095', 'T39188-0940-15-SV', '3 Phase')
    ,('2-56095', 'T39188-0940-15-SV', '208 Volts')
    ,('2-53564', 'T45156-0744-15', 'Keypad PB Controls')
    ,('2-53564', 'T45156-0744-15', '60 Hertz')
    ,('2-53564', 'T45156-0744-15', 'Right Side Front Location')
    ,('2-53564', 'T45156-0744-15', '2 x 1.50HP Motor')
    ,('2-53564', 'T45156-0744-15', '3 Phase')
    ,('2-53564', 'T45156-0744-15', '208 Volts')
    ,('2-65573', 'T45200-0944-15 SV WITH FOLDING GATE', 'Keypad PB Controls')
    ,('2-65573', 'T45200-0944-15 SV WITH FOLDING GATE', '60 Hertz')
    ,('2-65573', 'T45200-0944-15 SV WITH FOLDING GATE', 'Right Side Front Location')
    ,('2-65573', 'T45200-0944-15 SV WITH FOLDING GATE', '2 x 1.50HP Motor')
    ,('2-65573', 'T45200-0944-15 SV WITH FOLDING GATE', '3 Phase')
    ,('2-65573', 'T45200-0944-15 SV WITH FOLDING GATE', '480 Volts')
    ,('2-76617', 'W39191-1134-06 2-76617', 'Keypad PB Controls')
    ,('2-76617', 'W39191-1134-06 2-76617', '60 Hertz')
    ,('2-76617', 'W39191-1134-06 2-76617', 'Right Side Front Location')
    ,('2-76617', 'W39191-1134-06 2-76617', '2 x 1.00HP Motor')
    ,('2-76617', 'W39191-1134-06 2-76617', '3 Phase')
    ,('2-76617', 'W39191-1134-06 2-76617', '208 Volts')
    ,('2-70274', 'W39250-1630-16.5', 'Keypad PB Controls')
    ,('2-70274', 'W39250-1630-16.5', '50 Hertz')
    ,('2-70274', 'W39250-1630-16.5', 'Right Side Front Location')
    ,('2-70274', 'W39250-1630-16.5', '2 x 1.50HP Motor')
    ,('2-70274', 'W39250-1630-16.5', '3 Phase')
    ,('2-70274', 'W39250-1630-16.5', '208 Volts')
    ,('2-57285', 'W45243-1240-W-100', 'Keypad PB Controls')
    ,('2-57285', 'W45243-1240-W-100', '60 Hertz')
    ,('2-57285', 'W45243-1240-W-100', 'Right Side Front Location')
    ,('2-57285', 'W45243-1240-W-100', '2 x 1.50HP Motor')
    ,('2-57285', 'W45243-1240-W-100', '3 Phase')
    ,('2-57285', 'W45243-1240-W-100', '208 Volts')
GO

-- Query Parms
DECLARE
    @Desc       nvarchar(40) = NULL
    ,@P1        nvarchar(40) = NULL
    ,@P2        nvarchar(40) = NULL
    ,@P3        nvarchar(40) = NULL
    ,@P4        nvarchar(40) = NULL
    ,@P5        nvarchar(40) = NULL

-- Encase parm values with wildcards, and replace spaces in parm values with wildcards
SELECT
    @Desc = '%' + REPLACE(@Desc, ' ', '%') + '%'
    ,@P1 = '%' + REPLACE(@P1, ' ', '%') + '%'
    ,@P2 = '%' + REPLACE(@P2, ' ', '%') + '%'
    ,@P3 = '%' + REPLACE(@P3, ' ', '%') + '%'
    ,@P4 = '%' + REPLACE(@P4, ' ', '%') + '%'
    ,@P5 = '%' + REPLACE(@P5, ' ', '%') + '%';

-- Create temp table to hold the @P1 - @P5 parms
CREATE TABLE #Parms_List(parms nvarchar(40));

-- Insert @P parms into temp table for use later in INNER JOIN
WITH p (parms)
AS
(
    SELECT @P1
    UNION ALL SELECT @P2
    UNION ALL SELECT @P3
    UNION ALL SELECT @P4
    UNION ALL SELECT @P5    
)
INSERT INTO #Parms_List
SELECT parms FROM p WHERE parms IS NOT NULL

-- Insert all distinct cat_desc if all @P parms are null
IF @P1 IS NULL AND @P2 IS NULL AND @P3 IS NULL AND @P4 IS NULL AND @P5 IS NULL
BEGIN
    INSERT INTO #Parms_List
    SELECT DISTINCT c.cat_desc
    FROM #Item_Category_List AS c
END

-- Create temp table to hold matching item numbers for @Desc search
CREATE TABLE #Item_Desc_Match_List(item nvarchar(30));

-- Search #Item_Category_List for matching items based on description
-- and insert into #Item_Desc_Match_List for use later in INNER JOIN
IF @Desc IS NOT NULL
BEGIN
    -- Insert only matching items from #Item_Category_List
    INSERT INTO #Item_Desc_Match_List
    SELECT DISTINCT t.item
    FROM #Item_Category_List AS t
    WHERE t.item_desc LIKE @Desc
END
ELSE
BEGIN
    -- Insert all items from #Item_Category_List
    INSERT INTO #Item_Desc_Match_List
    SELECT DISTINCT t.item
    FROM #Item_Category_List AS t
END

-- Final Query for matching items
SELECT DISTINCT t.item

FROM #Item_Category_List AS t
INNER JOIN #Item_Desc_Match_List AS i
    ON i.item = t.item
INNER JOIN #Parms_List AS p
    ON t.cat_desc LIKE p.parms

ORDER BY t.item


DROP TABLE #Item_Category_List
DROP TABLE #Parms_List
DROP TABLE #Item_Desc_Match_List
我们的项目可以有多个类别链接到它们,此查询的目标是能够通过最多五个不同的类别以及项目描述来搜索项目,因此查询参数为@P1到@P5和@Desc

对于item description查询,我创建了一个临时表item_Desc_Match_List,并在临时日期表中插入一个描述匹配的不同项目列表,然后在最后一个查询中对该item_Desc_Match_List表进行内部联接

对于类别搜索,我的第一次尝试只是简单地尝试一个where子句,比如cat_desc like@P1或cat_desc like@P2等等。。。但是由于5@P参数中的任何一个都可以为null,所以这不起作用。因此,我的第二种方法是将所有@P参数放入一个临时表中,然后在最后一次查询cat_desc列上的临时数据表时进行内部联接。这有点管用

使用以下查询参数运行上述代码:

@Desc       nvarchar(40) = '1614'
,@P1        nvarchar(40) = NULL
,@P2        nvarchar(40) = NULL
,@P3        nvarchar(40) = NULL
,@P4        nvarchar(40) = NULL
,@P5        nvarchar(40) = NULL
您将得到以下结果:

item
------------------------------
2-59350
2-73432
2-74803
2-76582
2-78125
到目前为止,这是正确的,因为所有这些物品的描述中都有1614个。现在将@P1更改为“60赫兹”,结果如下:

item
------------------------------
2-59350
2-73432
2-76582
这也是正确的,因为这三个项目在它们的描述中有1614个,并且它们都链接了60赫兹的类别。现在将@P2更改为“220伏”,结果保持不变。这就是问题开始的地方,因为只有项目编号2-76582和2-59350链接了220伏类别

将@P3更改为“1 x 1.50HP”,结果应仅减少到1,2-59350,因为该项目是唯一一个描述类似@Desc且链接类别匹配@P1、@P2和@P3的项目


我已经在这个报告上转了几天了,我不知道如何才能让查询缩小我的结果范围,因为我定义了更多的@p参数,而不是像现在这样增加我的结果。

问题是,你在匹配任何一行与cat_desc匹配的结果,而不是所有的行

对于最简单的示例,让我们以第二个案例为例:

实际上,您正在返回所有行:

item    item_desc                   cat_desc    param
--------------------------------------------------------
2-73432 R20116-1614-06              60 Hertz    60 hertz
2-76582 R20116-1614-09              60 Hertz    60 hertz
2-76582 R20116-1614-09              220 Volts   220 Volt
2-59350 R20116-1614-12-STD-CNTRLS   60 Hertz    60 hertz
2-59350 R20116-1614-12-STD-CNTRLS   220 Volts   220 Volt
您真正需要的是按项目分组并计算匹配的行数:

SELECT  t.item, Matches = COUNT(*) 
FROM    #Item_Category_List AS t
        INNER JOIN p
            ON t.cat_desc LIKE '%' + p.param + '%'
WHERE   t.item_desc LIKE '%' + @Desc + '%'
GROUP BY t.item;
其中:

item    Matches
-------------
2-59350 2
2-73432 1
2-76582 2
然后,您可以将结果限制为与参数数量匹配的项目,即匹配所有提供的参数,而不是任何参数:

DECLARE  @Desc      nvarchar(40) = '1614'
        ,@P1        nvarchar(40) = '60 hertz'
        ,@P2        nvarchar(40) = '220 Volt'
        ,@P3        nvarchar(40) = NULL
        ,@P4        nvarchar(40) = NULL
        ,@P5        nvarchar(40) = NULL;

WITH p (param) AS
(
    SELECT  param
    FROM    (VALUES (@p1), (@p2), (@p3), (@p4), (@p5)) p (param)
    WHERE   p.param IS NOT NULL
)
SELECT  t.item
FROM    #Item_Category_List AS t
        INNER JOIN p
            ON t.cat_desc LIKE '%' + p.param + '%'
WHERE   t.item_desc LIKE '%' + @Desc + '%'
GROUP BY t.item
HAVING COUNT(p.Param) = (SELECT COUNT(*) FROM P);
这将产生所需的结果:

item
------------
2-59350
2-76582
最后,对于您的最后一个案例,您将获得一条记录2-59350:

DECLARE  @Desc      nvarchar(40) = '1614'
        ,@P1        nvarchar(40) = '60 hertz'
        ,@P2        nvarchar(40) = '220 Volt'
        ,@P3        nvarchar(40) = '1 x 1.50HP'
        ,@P4        nvarchar(40) = NULL
        ,@P5        nvarchar(40) = NULL;

WITH p (param) AS
(
    SELECT  param
    FROM    (VALUES (@p1), (@p2), (@p3), (@p4), (@p5)) p (param)
    WHERE   p.param IS NOT NULL
)
SELECT  t.item
FROM    #Item_Category_List AS t
        INNER JOIN p
            ON t.cat_desc LIKE '%' + p.param + '%'
WHERE   t.item_desc LIKE '%' + @Desc + '%'
GROUP BY t.item
HAVING COUNT(p.Param) = (SELECT COUNT(*) FROM P);
当然,这并没有说明没有提供任何参数,也没有说明,因此在这里,我将把内部联接更改为左联接,并向having和where子句添加额外的逻辑,以允许不提供参数:

DECLARE  @Desc      nvarchar(40) = NULL
        ,@P1        nvarchar(40) = NULL
        ,@P2        nvarchar(40) = NULL
        ,@P3        nvarchar(40) = NULL
        ,@P4        nvarchar(40) = NULL
        ,@P5        nvarchar(40) = NULL;

WITH p (param) AS
(
    SELECT  param
    FROM    (VALUES (@p1), (@p2), (@p3), (@p4), (@p5)) p (param)
    WHERE   p.param IS NOT NULL
)
SELECT  t.item
FROM    #Item_Category_List AS t
        LEFT JOIN p
            ON t.cat_desc LIKE '%' + p.param + '%'
WHERE   t.item_desc LIKE '%' + @Desc + '%'
OR      @Desc IS NULL
GROUP BY t.item
HAVING  COUNT(p.Param) = (SELECT COUNT(*) FROM P)
OR      (SELECT COUNT(*) FROM P) = 0;
这不太可能执行得很好,但由于所有的比较都类似于操作,因此我认为无论哪种方式都无法避免全表扫描

作为一个旁白,我将考虑使用表值参数,而不是使用6个参数:

CREATE TYPE dbo.ListOfString AS TABLE (Value NVARCHAR(MAX));
我倾向于为这样的事情创建泛型类型,以便它们更具可重用性,但这是个人偏好,如果您不介意加载类型并且担心表中的严格数据长度,那么可以随意使类型更具体

那么您的程序将类似于:

CREATE PROCEDURE dbo.SearchItemCategoryList @Desc NVARCHAR(40), @Params dbo.ListOfString READONLY
AS
BEGIN

    SELECT  t.item
    FROM    dbo.Item_Category_List AS t
            LEFT JOIN @Params AS p
                ON t.cat_desc LIKE '%' + p.Value + '%'
    WHERE   t.item_desc LIKE '%' + @Desc + '%'
    OR      @Desc IS NULL
    GROUP BY t.item
    HAVING  COUNT(p.Value) = (SELECT COUNT(*) FROM @Params)
    OR      (SELECT COUNT(*) FROM @Params) = 0;

END
-- GET ALL
DECLARE @P dbo.ListOfString;
EXECUTE dbo.SearchItemCategoryList NULL, @p;
GO
-- GET MATCHING JUST DESCRIPTION
DECLARE @P dbo.ListOfString;
EXECUTE dbo.SearchItemCategoryList '1614', @p;
GO
-- GET USING ONE PARAMETER
DECLARE @P dbo.ListOfString;
INSERT @p (Value) VALUES ('60 hertz');
EXECUTE dbo.SearchItemCategoryList '1614', @p;
GO
-- GET USING THREE PARAMETERS
DECLARE @P dbo.ListOfString;
INSERT @p (Value) VALUES ('60 hertz'), ('220 Volt'), ('1 x 1.50HP');
EXECUTE dbo.SearchItemCategoryList '1614', @p;
您可以使用以下方法调用该过程:

CREATE PROCEDURE dbo.SearchItemCategoryList @Desc NVARCHAR(40), @Params dbo.ListOfString READONLY
AS
BEGIN

    SELECT  t.item
    FROM    dbo.Item_Category_List AS t
            LEFT JOIN @Params AS p
                ON t.cat_desc LIKE '%' + p.Value + '%'
    WHERE   t.item_desc LIKE '%' + @Desc + '%'
    OR      @Desc IS NULL
    GROUP BY t.item
    HAVING  COUNT(p.Value) = (SELECT COUNT(*) FROM @Params)
    OR      (SELECT COUNT(*) FROM @Params) = 0;

END
-- GET ALL
DECLARE @P dbo.ListOfString;
EXECUTE dbo.SearchItemCategoryList NULL, @p;
GO
-- GET MATCHING JUST DESCRIPTION
DECLARE @P dbo.ListOfString;
EXECUTE dbo.SearchItemCategoryList '1614', @p;
GO
-- GET USING ONE PARAMETER
DECLARE @P dbo.ListOfString;
INSERT @p (Value) VALUES ('60 hertz');
EXECUTE dbo.SearchItemCategoryList '1614', @p;
GO
-- GET USING THREE PARAMETERS
DECLARE @P dbo.ListOfString;
INSERT @p (Value) VALUES ('60 hertz'), ('220 Volt'), ('1 x 1.50HP');
EXECUTE dbo.SearchItemCategoryList '1614', @p;