场景:我有一个SSRS报告,其中包含一堆过滤器。其中一个过滤器是“区域”,我得到的区域是这样的:
SELECT DISTINCT Area FROM tblArea ORDER BY Area
对于从中获取其可用值的参数,我有一个默认值“All”,因此输出将如下:
所有 区域1 区域2 中国 我们 等
在报告中,他们可以选择“全部”,当传递给主存储过程时,参数将如下所示:
全部,区域1,区域2,中国,美国等
现在出现问题:在我查询Area列的表中可能包含如下数据:
Area
--------
Area2,US
查询是
SELECT * FROM tbl WHERE TPC IN (@Area) -- All,Area1,Area2,China,US,etc
这不会找到我要找的记录。
简而言之,如何将逗号分隔列中的每个值与逗号分隔的参数进行比较?
提前致谢,
答案 0 :(得分:0)
您的查询正在查找单个值,其中包含逗号。 in
不解析字符串。
您可以使用like
:
where @Area = 'All' or
','+TPC+',' like '%,'+@Area+',%';
当一个区域包含在另一个区域(例如“US”和“USSR”)时,逗号的使用是为了防止碰撞。
答案 1 :(得分: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
答案 2 :(得分:0)
在SQL中,您必须创建一个表值函数,它将逗号分隔的字符串@Area转换为Table。然后,您可以使用此表进行查询。
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))