2013-10-31 23 views
0

情景:我有一个SSRS报告,其中包含一堆过滤器。其中一个过滤器是“区域”,我得到这样的区域,以便:SQL Server - 根据所有可能的值搜索逗号分隔列表

SELECT DISTINCT Area FROM tblArea ORDER BY Area 

我有一个默认值“全部”对于会从它的可用值,所以输出会是这样的参数:

所有 区域1 区域2 中国 美国 等

在报告中,他们可以选择“全部”,它传递给主存储过程时的参数看起来像:

所有,区域1,区域2,中国,美国等

现在这里是问题:我在其中查询区列可能有这样的数据表:

Area 
-------- 
Area2,US 

并且查询

SELECT * FROM tbl WHERE TPC IN (@Area) -- All,Area1,Area2,China,US,etc 

而这不会找到我正在寻找的记录。

总之,我怎么比较反对以逗号分隔的参数用逗号分隔的列中的每个值?

由于提前,

+0

尝试是这样的http://stackoverflow.com/a/19688758/2848551 – sahalMoidu

+0

不要推倒重来,使用内置在多值参数功能。重复的[这个问题](http://stackoverflow.com/questions/19687600/ssrs-multilookup-function-for-names-with-comma-separation/19689172#19689172)。 – Bryan

回答

0

您所查询的是寻找一个单一的值,即有一个逗号它。 in不解析字符串。

你可以做你想要使用的是什么like

where @Area = 'All' or 
     ','+TPC+',' like '%,'[email protected]+',%'; 

使用逗号是为了防止冲突,当一个区域包含在另一个(比如,“美国”和“苏联”)。

+0

@Area从不设置为'ALL'。这对我没有帮助。 – andrewb

+1

这似乎与您的原始帖子相矛盾,其中指出“我的参数的默认值为”全部“ - 您能澄清这意味着什么吗? – Nathan

+0

SSRS参数的默认值是全部,但是当它发送到SPROC时,它是所有区域的连接值。 – andrewb

0

我想下面的例子将解决你的目的

CREATE TABLE #TBL 
    ([Id] int, [Areas] varchar(11)) 
; 

INSERT INTO #TBL 
    ([Id], [Areas]) 
VALUES 
    (1, 'abc,def,ghi'), 
    (2, 'abc,def'), 
    (3, 'abc') 
; 


DECLARE @Area VARCHAR(100) -- parameter 
SET @Area = 'All,abc,def,ghi' 

;with cte 
as 
(
    select Areaxml.s.value('.','varchar(100)') as Area 
    from 
    (
    select convert(xml,'<m>'+replace(@Area,',','</m><m>')+'</m>') as CArea 
    )t 
    cross apply 
    CArea.nodes('/m') as Areaxml(s) 
) 


select * FROM #TBL 
where exists (select Area from cte where [Areas] LIKE '%'+ Area +'%') 

DROP TABLe #TBL 
0

在SQL中,你必须创建一个表值函数将在逗号分隔字符串@area转换成表。然后您可以使用此表进行查询。

ALTER FUNCTION [dbo].[List_to_tbl] (@list nvarchar(MAX)) 
    RETURNS @tbl TABLE (stringsTable nvarchar(10) NOT NULL) AS 
BEGIN 
    DECLARE @pos  int, 
     @nextpos int, 
     @valuelen int 

SELECT @pos = 0, @nextpos = 1 

    WHILE @nextpos > 0 
     BEGIN 
      SELECT @nextpos = charindex(',', @list, @pos + 1) 
      SELECT @valuelen = CASE WHEN @nextpos > 0 
          THEN @nextpos 
          ELSE len(@list) + 1 
        END - @pos - 1 
      INSERT @tbl (stringsTable) 
       VALUES (substring(@list, @pos + 1, @valuelen)) 
      SELECT @pos = @nextpos 
    END 
RETURN 

END 

现在,你可以从存储调用此过程

Select * from TBL where TPC in (Select stringTable from List_to_tbl(@Area))