0

シナリオ: 多数のフィルターを含む SSRS レポートがあります。これらのフィルターの 1 つは「エリア」用で、次のようなエリアを取得します。

SELECT DISTINCT Area FROM tblArea ORDER BY Area

そこから利用可能な値を取得するパラメーターのデフォルト値は「すべて」であるため、出力は次のようになります。

すべて Area1 Area2 中国 米国など

レポートでは、メインのストアド プロシージャに渡されると、パラメータは次のようになる「すべて」を選択できます。

すべて、Area1、Area2、中国、米国など

ここに問題があります。クエリを実行するテーブルでは、Area 列に次のようなデータが含まれている可能性があります。

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

そしてクエリは

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

そして、これは私が探しているレコードを見つけられません。

要するに、コンマ区切りの列の各値をコンマ区切りのパラメーターと比較するにはどうすればよいですか?

前もって感謝します、

4

3 に答える 3

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 に答える
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 に答える