2013-10-31 80 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))