복붙노트

[SQL] Reporting Services의 단일 매개 변수에 대해 여러 값을 전달

SQL

Reporting Services의 단일 매개 변수에 대해 여러 값을 전달

내 보고서에 여러 다중 선택 매개 변수가 있습니다. 나는 웹 쿼리 문자열에서 하나의 매개 변수에 대해 여러 값을 전달하는 방법을 찾기 위해 노력하고 있어요? 내가 단일 값에 전달하면, 그것을 잘 작동합니다.

이 보고서는 하나의 PARAM을위한 좋은 선택 다중 선택을 실행합니다. 웹 쿼리 문자열에 내 문제가 자리 잡고 있습니다.

해결법

  1. ==============================

    1.존 Sansom의 솔루션 작동하지만, UDF 평가 잠재적으로 비효율적 인 스칼라를 사용하지 않고,이 작업을 수행하는 또 다른 방법이있다. SSRS를 보고서에서 쿼리 정의의 매개 변수 탭에서 매개 변수 값을하는 설정

    존 Sansom의 솔루션 작동하지만, UDF 평가 잠재적으로 비효율적 인 스칼라를 사용하지 않고,이 작업을 수행하는 또 다른 방법이있다. SSRS를 보고서에서 쿼리 정의의 매개 변수 탭에서 매개 변수 값을하는 설정

    =join(Parameters!<your param name>.Value,",")
    

    쿼리에서는 다음과 같이 값을 참조 할 수 있습니다 :

    where yourColumn in (@<your param name>)
    
  2. ==============================

    2.이것은 또 다른 다중 선택 PARAM에 다중 선택 PARAM을 통과 할 때 내가 사용하는 것입니다.

    이것은 또 다른 다중 선택 PARAM에 다중 선택 PARAM을 통과 할 때 내가 사용하는 것입니다.

    =SPLIT(JOIN(Parameters!<your param name>.Value,","),",")
    
  3. ==============================

    3.이것은 SQL Reporting Services의 가난한 지원되는 기능 중 하나입니다.

    이것은 SQL Reporting Services의 가난한 지원되는 기능 중 하나입니다.

    당신이해야 할 것은 당신의 저장 프로 시저에 하나의 문자열로 선택한 모든 항목을 통과합니다. 스트링 내의 각 요소는 콤마로 분리된다.

    내가 다음 할 것은 분할 함수를 사용하여 문자열이 반환 테이블로 제공되는 문자열입니다. 아래를 참조하십시오.

    ALTER FUNCTION [dbo].[fn_MVParam]
       (@RepParam nvarchar(4000), @Delim char(1)= ',')
    RETURNS @Values TABLE (Param nvarchar(4000))AS
      BEGIN
      DECLARE @chrind INT
      DECLARE @Piece nvarchar(100)
      SELECT @chrind = 1 
      WHILE @chrind > 0
        BEGIN
          SELECT @chrind = CHARINDEX(@Delim,@RepParam)
          IF @chrind  > 0
            SELECT @Piece = LEFT(@RepParam,@chrind - 1)
          ELSE
            SELECT @Piece = @RepParam
          INSERT  @Values(Param) VALUES(CAST(@Piece AS VARCHAR))
          SELECT @RepParam = RIGHT(@RepParam,LEN(@RepParam) - @chrind)
          IF LEN(@RepParam) = 0 BREAK
        END
      RETURN
      END
    

    당신은 다음과 같이 메인 쿼리의 WHERE 절에 결과를 참조 할 수 있습니다 :

    where someColumn IN(SELECT Param FROM dbo.fn_MVParam(@sParameterString,','))
    

    나는이 당신이 사용 될 수있는이 솔루션을 찾을 수 있기를 바랍니다. 당신이 가질 수있는 질문을 제기 주시기 바랍니다.

    건배, 존

  4. ==============================

    4.존 Sansom 에드 하퍼 좋은 솔루션이있다. 그러나, 나는 ID 필드 (즉, 정수)를 처리 할 때 작업에 그들을 얻을 수 없습니다. 나는 테이블에 기본 키 열이 가입 할 수 있도록 정수로 값을 변환하려면 아래의 분할 기능을 수정했습니다. 또한 코드를 주석하고 경우에 구분 된 목록의 순서가 중요했다, 주문 열을 추가했다.

    존 Sansom 에드 하퍼 좋은 솔루션이있다. 그러나, 나는 ID 필드 (즉, 정수)를 처리 할 때 작업에 그들을 얻을 수 없습니다. 나는 테이블에 기본 키 열이 가입 할 수 있도록 정수로 값을 변환하려면 아래의 분할 기능을 수정했습니다. 또한 코드를 주석하고 경우에 구분 된 목록의 순서가 중요했다, 주문 열을 추가했다.

    CREATE FUNCTION [dbo].[fn_SplitInt]
    (
        @List       nvarchar(4000),
        @Delimiter  char(1)= ','
    )
    RETURNS @Values TABLE
    (
        Position int IDENTITY PRIMARY KEY,
        Number int
    )
    
    AS
    
      BEGIN
    
      -- set up working variables
      DECLARE @Index INT
      DECLARE @ItemValue nvarchar(100)
      SELECT @Index = 1 
    
      -- iterate until we have no more characters to work with
      WHILE @Index > 0
    
        BEGIN
    
          -- find first delimiter
          SELECT @Index = CHARINDEX(@Delimiter,@List)
    
          -- extract the item value
          IF @Index  > 0     -- if found, take the value left of the delimiter
            SELECT @ItemValue = LEFT(@List,@Index - 1)
          ELSE               -- if none, take the remainder as the last value
            SELECT @ItemValue = @List
    
          -- insert the value into our new table
          INSERT INTO @Values (Number) VALUES (CAST(@ItemValue AS int))
    
          -- remove the found item from the working list
          SELECT @List = RIGHT(@List,LEN(@List) - @Index)
    
          -- if list is empty, we are done
          IF LEN(@List) = 0 BREAK
    
        END
    
      RETURN
    
      END
    

    이전에 언급 한 바와 같이이 기능을 사용 :

    WHERE id IN (SELECT Number FROM dbo.fn_SplitInt(@sParameterString,','))
    
  5. ==============================

    5.신탁:

    신탁:

    오라클 연결에 대해 "IN"구 (에드의 해결)하지 않습니다 일 (적어도 버전 10). 그러나 않습니다이 간단한 해결 방법을 찾아 냈다. 를 CSV로 다중 값 매개 변수를 설정 데이터 세트의 매개 변수의 탭을 사용하여 :

        :name =join(Parameters!name.Value,",")
    

    그런 다음 SQL 문에 절은 일치를 확인하기 위해 instring 기능을 사용하여 WHERE.

        INSTR(:name, TABLE.FILENAME) > 0
    
  6. ==============================

    6.나는 다른 멋진 fn_MVParam 문제 다 퉜다. SSRS 2005 년 2 따옴표로 아포스트로피로 데이터를 전송.

    나는 다른 멋진 fn_MVParam 문제 다 퉜다. SSRS 2005 년 2 따옴표로 아포스트로피로 데이터를 전송.

    나는이 문제를 해결하기 위해 한 줄을 추가했다.

    select @RepParam = replace(@RepParam,'''''','''')
    

    는 fn 내 버전은 NVARCHAR 대신 VARCHAR 사용합니다.

    CREATE FUNCTION [dbo].[fn_MVParam]
       (
        @RepParam varchar(MAX),
        @Delim char(1)= ','
       )
    RETURNS @Values TABLE (Param varchar(MAX)) AS
    /*
      Usage:  Use this in your report SP 
         where ID in (SELECT Param FROM fn_MVParam(@PlanIDList,','))
    */
    
    BEGIN
    
       select @RepParam = replace(@RepParam,'''''','''')
       DECLARE @chrind INT
       DECLARE @Piece varchar(MAX)
       SELECT @chrind = 1
       WHILE @chrind > 0
          BEGIN
             SELECT @chrind = CHARINDEX(@Delim,@RepParam)
             IF @chrind > 0
                SELECT @Piece = LEFT(@RepParam,@chrind - 1)
             ELSE
                SELECT @Piece = @RepParam
             INSERT @VALUES(Param) VALUES(@Piece)
             SELECT @RepParam = RIGHT(@RepParam,DATALENGTH(@RepParam) - @chrind)
             IF DATALENGTH(@RepParam) = 0 BREAK
          END
       RETURN
    END
    
  7. ==============================

    7.위대한 존 솔루션의 수정, 해결 :

    위대한 존 솔루션의 수정, 해결 :

  8. ==============================

    8.그냥 코멘트 - 나는 오라클 10g에 관련 작업에 대한 IN 절을 얻으려고 상처의 세계로 달렸다. 나는 다시 쿼리가 제대로 10g의 DB에 전달 될 수 있다고 생각하지 않습니다. 나는 완전히 다 값을 드롭했다. (다치 파라미터 선택 부)에서 하나의 값이 선택되었을 때 쿼리는 데이터를 리턴한다. 나는 동일한 결과로 MS와 오라클 드라이버를 시도했다. 나는 사람이 함께 성공을했다하면 듣고 싶네요.

    그냥 코멘트 - 나는 오라클 10g에 관련 작업에 대한 IN 절을 얻으려고 상처의 세계로 달렸다. 나는 다시 쿼리가 제대로 10g의 DB에 전달 될 수 있다고 생각하지 않습니다. 나는 완전히 다 값을 드롭했다. (다치 파라미터 선택 부)에서 하나의 값이 선택되었을 때 쿼리는 데이터를 리턴한다. 나는 동일한 결과로 MS와 오라클 드라이버를 시도했다. 나는 사람이 함께 성공을했다하면 듣고 싶네요.

  9. ==============================

    9., @paramName NVARCHAR AS (500)를 선언

    , @paramName NVARCHAR AS (500)를 선언

    IF RIGHT (@paramName, 1) = '' BEGIN  ((((@ paramName에) paramName에, LEN @ SET @paramName = LEFT -1) 종료

  10. ==============================

    10.아마 첫번째 테이블에 다중 값을 추가하는 것이 더 쉽습니다 그리고 당신은 가입 할 수 있습니다 또는 당신이 무엇을 (심지어 와일드 카드) 싶습니다 또는 저장 다른 테이블에 데이터를 나중에 사용하기 위해 (또는 다른 테이블에 값을 추가) .

    아마 첫번째 테이블에 다중 값을 추가하는 것이 더 쉽습니다 그리고 당신은 가입 할 수 있습니다 또는 당신이 무엇을 (심지어 와일드 카드) 싶습니다 또는 저장 다른 테이블에 데이터를 나중에 사용하기 위해 (또는 다른 테이블에 값을 추가) .

    데이터 집합의 표현을 통해 매개 변수 값을 설정합니다 :

    ="SELECT DISTINCT * FROM (VALUES('" & JOIN(Parameters!SearchValue.Value, "'),('") & "')) 
    AS tbl(Value)"
    

    쿼리 자체 :

    DECLARE @Table AS TABLE (Value nvarchar(max))
    
    INSERT INTO @Table EXEC sp_executeSQL @SearchValue 
    

    와일드 카드 예 :

    SELECT * FROM YOUR_TABLE yt 
    
    INNER JOIN @Table rt ON yt.[Join_Value] LIKE '%' + rt.[Value] + '%'
    

    나는 동적 SQL없이 할 수있는 방법 알아 내기 위해 싶지만 나는 방법에 SSRS 실제 쿼리에 매개 변수를 전달 인해 작동 거라고 생각하지 않습니다. 누군가가 잘 알고 있다면 알려 주시기 바랍니다.

  11. ==============================

    11.이 문자열의 구별 세트의 일 (예를 들어, "START", "END", "ERROR", "SUCCESS") 1)보고 파라미터 (예컨대 @log_status 정의) 및 "다중 값 허용"체크

    이 문자열의 구별 세트의 일 (예를 들어, "START", "END", "ERROR", "SUCCESS") 1)보고 파라미터 (예컨대 @log_status 정의) 및 "다중 값 허용"체크

    2) 데이터 세트를 정의 할 3) 데이터 셋 - 등록 정보 창을 열고 3A) 쿼리 탭에서 검색어를 입력 : 예를 들어,

    select * from your_table where (CHARINDEX(your_column, @log_status,0) > 0)
    

    3B) 매개 변수 탭에 입력하여 매개 변수, 예를 들어, 경우 ParameterName : @log_status; 가 parameterValue << >> EXPR 3C)에 EXPR은 "FX"- 버튼을 클릭하고 입력 :

    =join(Parameters!log_status.Value,",")
    

    끝마친! (나를 위해 작동하지 않았다 이런 말을 에드 하퍼의 솔루션과 유사하지만, 미안)

  12. ==============================

    12.당신은 쿼리 문자열을 통해 RS 여러 값을 전달하려는 경우 당신이 오직 할 필요가있는 각 값에 대해 보고서 매개 변수를 반복합니다.

    당신은 쿼리 문자열을 통해 RS 여러 값을 전달하려는 경우 당신이 오직 할 필요가있는 각 값에 대해 보고서 매개 변수를 반복합니다.

    예를 들어; 나는 COLS라는 RS 열이이 열은 하나 개 이상의 값을 기대하고있다.

    &rp:COLS=1&rp:COLS=1&rp:COLS=5 etc..
    
  13. ==============================

    13.당신도 할 수있는 당신의 저장 프로 시저에이 코드를 추가 할 수 있습니다 :

    당신도 할 수있는 당신의 저장 프로 시저에이 코드를 추가 할 수 있습니다 :

    set @s = char(39) + replace(@s, ',', char(39) + ',' + char(39)) + char(39)
    

    (@s 가정하면) "A, B, C '와 같은 (다중 값 문자열)

  14. ==============================

    14.나는 사이트에 새로 온 사람, 그리고 그림은 어떻게이 될한다고 생각 무엇을 이전의 대답에 대해 언급 할 수있다. 또한 최대 나는 나에게 내 대답을 준 믿고 제프의 게시물을 투표를 할 수 없었다. 어쨌든 ...

    나는 사이트에 새로 온 사람, 그리고 그림은 어떻게이 될한다고 생각 무엇을 이전의 대답에 대해 언급 할 수있다. 또한 최대 나는 나에게 내 대답을 준 믿고 제프의 게시물을 투표를 할 수 없었다. 어쨌든 ...

    나는 위대한 게시물, 이후 개조하면 되겠 어, 작품의 일부가, 난 단지 어떤 UDF, SP 있도록 또는 뷰 기반 솔루션은 나를 위해 작동, 데이터베이스에 대한 읽기 액세스 방법을 볼 수 있지만. 에드 하퍼의 솔루션은 당신이 WHERE IN 절에 매개 변수로 쉼표로 분리 된 문자열을 전달하고 당신이 필요로하는 작업에 예상 할 수없는 VenkateswarluAvula의 코멘트를 제외하고, 좋은 보았다 그래서. 그러나 오라클 10g에 제프의 솔루션은 그 차이를 채 웁니다. 나는 http://blogs.msdn.com/b/bimusings/archive/2007/05/07/how-do-you-set-select-all-as-the-default-에서 러셀 크리스토퍼의 블로그 게시물과 그 함께 넣어 대한-다중 값 파라미터 -에 -보고 - services.aspx 그리고 내 해결책을 가지고 있습니다 :

    사용 가능한 값의 어떤 소스 (아마도 데이터 집합)를 사용하여 다중 선택 매개 변수 MYPARAMETER을 만듭니다. 내 경우, 다중 선택은 TEXT 항목의 무리에서했다, 그러나 나는 다른 종류의 작업을 할 일부 조정과 확신합니다. 당신이 모두 선택이 기본 위치가 될하려는 경우, 기본값으로 동일한 소스를 설정합니다. 이렇게하면 사용자 인터페이스를 제공하지만, 생성 된 매개 변수 내 SQL에 전달 된 매개 변수가 아닙니다.

    는 SQL에 앞서 건너 뛰기 및 WHERE IN (@MYPARAMETER) 문제에 제프의 솔루션, 나는 ( '충전') 다른 값 중 하나 ( '비 충전'에 나타나는 값의 1에, 내 자신의 문제가 ), 거짓 양성을 찾을 수있는 CHARINDEX을 의미한다. 나는 이전과 이후 모두 구분 된 값의 매개 변수를 검색 할 필요가 있었다. 이 방법은 확실 쉼표로 분리 된 목록을 선도하고 trailling 쉼표를 가지고도 확인해야합니다. 그리고 이것은 내 SQL 조각은 다음과 같습니다

    where ...
    and CHARINDEX(',' + pitran.LINEPROPERTYID + ',', @MYPARAMETER_LIST) > 0
    

    중간에 비트 (생산에 숨겨져 있지만 개발되지 동안) 또 다른 매개 변수를 만드는 것입니다 :

    그냥있는 텍스트의 조각 같은 SQL이 처리하는 검색 문자열 만 될 일이 SQL로 전달되는이 매개 변수입니다.

    나는 누군가가 원하는 것을 찾을 수 있습니다 함께 답변이 조각을 넣어 바랍니다.

  15. ==============================

    15.과거에 나는 서비스를보고하는 SQL Server 쿼리에서 여러 년을 선택하는 저장 프로 시저 및 함수를 사용하여에 의존했다. 에드 하퍼에 의해 제안으로 쿼리 매개 변수 값의 표현을 가입하여, 여전히 곳 문에 SQL IN 절과 함께 작동하지 않을 것입니다. 내 해상도는 표현에 참여 매개 변수와 함께 WHERE 절에 다음을 사용하는 것이 었습니다 :     및 charIndex의 (주조 (Schl.Invt_Yr 문자 (4)), @Invt_Yr)> 0

    과거에 나는 서비스를보고하는 SQL Server 쿼리에서 여러 년을 선택하는 저장 프로 시저 및 함수를 사용하여에 의존했다. 에드 하퍼에 의해 제안으로 쿼리 매개 변수 값의 표현을 가입하여, 여전히 곳 문에 SQL IN 절과 함께 작동하지 않을 것입니다. 내 해상도는 표현에 참여 매개 변수와 함께 WHERE 절에 다음을 사용하는 것이 었습니다 :     및 charIndex의 (주조 (Schl.Invt_Yr 문자 (4)), @Invt_Yr)> 0

  16. ==============================

    16.이 다중 값 매개 변수를 저장하는 기능을 조인을 사용하고 나중에 데이터베이스에서 동일한 선택을 복원하는 것입니다.

    이 다중 값 매개 변수를 저장하는 기능을 조인을 사용하고 나중에 데이터베이스에서 동일한 선택을 복원하는 것입니다.

    이전에 사용자가 선택한 값을 다시 한 번 선택해야합니다, 난 그냥 매개 변수를 저장해야한다는 요구 사항을 가지고 보고서를 완료하고 보고서를 다시 열 때 (보고서는 OrderID를의 paramater 전달됩니다).

    이 보고서는 각자가 자신의 데이터 세트 및 목록 드롭 다운을 결과를 가지고, 다스 매개 변수의 절반을 사용했다. 매개 변수는 최종 선택의 범위를 좁힐 이전 매개 변수에 의존했고, 보고서가 "볼"때 저장 프로 시저를 채울 불렀다.

    저장 프로 시저는 보고서에서 전달 된 각 매개 변수를 받았다. 이 매개 변수가 OrderID를 위해 저장 알아보기 위해 데이터베이스에 저장 테이블을 확인. 그렇지 않으면, 그것은 모든 매개 변수를 저장. 그렇다면, 그것은 (이것은 사용자가 나중에 자신의 마음을 변경하는 경우입니다) 순서의 모든 매개 변수를 업데이트했습니다.

    보고서 실행이 존재하는 그 주문 ID 경우의 단일 행을 이동 및 선택 SQL 텍스트 인 데이터 집합 dsParameters있을 때. 보고서의 매개 변수 각각이 데이터 집합에서 기본 값을 가져옵니다 및 데이터 집합에서의 선택 목록은 매개 변수에 전념.

    나는 다중 선택 매개 변수에 문제가 다 퉜다. 나는 쉼표가 문자열을 구분 저장 프로 시저에 전달 (@Value, ",")의 주요 데이터 세트 매개 변수 목록에서 명령을 결합 사용했다. 하지만 어떻게 그것을 복원하는? 당신은 값이 매개 변수의 상자 기본값으로 쉼표로 구분 된 문자열을 다시 공급되지 않습니다.

    IF OBJECT_ID('tempdb..#Parse','U') IS NOT NULL DROP TABLE #Parse
    
    DECLARE @Start int, @End int, @Desc varchar(255)
    
    SELECT @Desc = fldDesc FROM dbCustomData.dbo.tblDirectReferralFormParameters WHERE fldFrom = @From and fldOrderID = @OrderID
    
    CREATE TABLE #Parse (fldDesc varchar(255))
    
    SELECT @Start = 1, @End = 1
    
    WHILE @End > 0
        BEGIN
            SET @End = CHARINDEX(',',@Desc,@Start)
            IF @End = 0 
                BEGIN
                    INSERT #Parse SELECT REPLACE(SUBSTRING(@Desc,@Start,LEN(@Desc)),',','') AS fldDesc 
                    BREAK
                END
            ELSE        
                BEGIN
                    INSERT #Parse SELECT REPLACE(SUBSTRING(@Desc,@Start,@End-@Start),',','') AS fldDesc 
                END
            SET @Start = @End + 1
        END
    
    SELECT * FROM #Parse
    

    양식을 열 때마다,이 다중 값 매개 변수에 저장된 문자열이 데이터 집합을 검사 데이터베이스. 하나가없는 경우는 null를 돌려줍니다. 에있을 경우, 쉼표를 분석하고 각각의 값에 대한 행을 생성한다.

    그런 다음 기본값 상자가이 데이터 집합 및 fldDesc로 설정됩니다. 효과가있다! 내가 하나 또는 여러을 선택하면, 그들은 저장하고 양식을 다시 열 때 보충.

    이게 도움이 되길 바란다. 나는 잠시 동안 검색과 데이터베이스에서 문자열을 결합 저장 한 후 데이터 세트에서 그것을 밖으로 구문 분석에 대한 언급을 찾을 수 없습니다.

  17. ==============================

    17.이것은 나를 위해 잘 작동합니다 :

    이것은 나를 위해 잘 작동합니다 :

    WHERE CHARINDEX(CONVERT(nvarchar, CustNum), @CustNum) > 0
    
  18. ==============================

    18.그래서 다중 텍스트 값이 사용 =이 (매개 변수! Customer.Value을, '', '')에 가입 각 I 주위에 작은 따옴표와 쿼리에 끝날 것입니다. 그래서 이후에 쉼표, 따옴표, 작은 따옴표, 쉼표, 따옴표, 큰 따옴표, 근접 브래킷은 ".Value." 단일체 :)

    그래서 다중 텍스트 값이 사용 =이 (매개 변수! Customer.Value을, '', '')에 가입 각 I 주위에 작은 따옴표와 쿼리에 끝날 것입니다. 그래서 이후에 쉼표, 따옴표, 작은 따옴표, 쉼표, 따옴표, 큰 따옴표, 근접 브래킷은 ".Value." 단일체 :)

  19. ==============================

    19.아래의 솔루션은 날 위해 일했습니다.

    아래의 솔루션은 날 위해 일했습니다.

  20. ==============================

    20.MSSQL 2016으로 - 호환성 수준 (130)와, 당신은 String_Split은 () SSRS에서 합류 매개 변수를 구문 분석하는 데 활용할 수 있습니다. 당신이 SSRS에서 쿼리에서 매개 변수를 채우고 싶어 한 다음 저장된 프로 시저 또는 SSRS 공유 데이터 집합에이 PARAM을 통과 말 :

    MSSQL 2016으로 - 호환성 수준 (130)와, 당신은 String_Split은 () SSRS에서 합류 매개 변수를 구문 분석하는 데 활용할 수 있습니다. 당신이 SSRS에서 쿼리에서 매개 변수를 채우고 싶어 한 다음 저장된 프로 시저 또는 SSRS 공유 데이터 집합에이 PARAM을 통과 말 :

  21. ==============================

    21.나는 Oracle 용 솔루션을 필요로하고 나는이 DB> = 10g 내 보고서 내 쿼리 안에 나를 위해 일한 발견했다.

    나는 Oracle 용 솔루션을 필요로하고 나는이 DB> = 10g 내 보고서 내 쿼리 안에 나를 위해 일한 발견했다.

    어디에서 (SELECT * FROM 이중에서 (1 레벨 '[^] +')를 선택 REGEXP_SUBSTR ) null이 아니고 (레벨 1 '[^] +')에 의해 연결 REGEXP_SUBSTR;

    출처 https://blogs.oracle.com/aramamoo/entry/how_to_split_comma_separated_string_and_pass_to_in_clause_of_select_statement

  22. from https://stackoverflow.com/questions/512105/passing-multiple-values-for-a-single-parameter-in-reporting-services by cc-by-sa and MIT license