0

场景:我有一个 SSRS 报告,其中包含一堆过滤器。其中一个过滤器用于“区域”,我得到的区域如下:

SELECT DISTINCT Area FROM tblArea ORDER BY Area

对于从中获取其可用值的参数,我有一个默认值“All”,因此输出将如下所示:

全部 Area1 Area2 中国 美国 等

在报告中,他们可以选择“全部”,当传递给主存储过程时,参数将如下所示:

全部、Area1、Area2、中国、美国等

现在这是问题所在:在我查询区域列的表中可能有如下数据:

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

查询是

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

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

简而言之,如何将逗号分隔列中的每个值与逗号分隔参数进行比较?

提前致谢,

4

3 回答 3

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))
于 2013-10-31T20:45:00.107 回答
0

您的查询正在寻找一个包含逗号的值。in不解析字符串。

你可以做你想做的事like

where @Area = 'All' or
      ','+TPC+',' like '%,'+@Area+',%';

当一个区域包含在另一个区域中时(例如,“US”和“USSR”),逗号的使用是为了防止冲突。

于 2013-10-31T01:11:50.167 回答
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
于 2013-10-31T12:21:06.883 回答