문제

다음은 작동하지 않지만 이와 같은 것이 내가 찾고 있는 것입니다.

select *
from Products
where Description like (@SearchedDescription + %)

SSRS는 매개변수 앞에 @ 연산자를 사용하여 'in'을 시뮬레이션하는데 문자열을 문자열 목록과 일치시키는 방법을 찾지 못했습니다.

도움이 되었습니까?

해결책

매개변수와 함께 LIKE 연산자를 사용하는 방법에 대한 몇 가지 옵션이 있습니다.

옵션 1

매개변수 값에 %를 추가하면 LIKE 필터가 처리되는 방식을 사용자 정의할 수 있습니다.예를 들어 쿼리는 다음과 같을 수 있습니다.

 SELECT name
 FROM master.dbo.sysobjects
 WHERE name LIKE @ReportParameter1

데이터 세트가 LIKE 문을 올바르게 사용하려면 sysa%와 같은 매개변수 값을 사용할 수 있습니다.이 코드를 사용하여 SSRS 2008에서 샘플 보고서를 테스트했을 때 다음 4개의 테이블이 반환되었습니다.

 sysallocunits
 sysaudacts
 sysasymkeys
 sysaltfiles

옵션 2

사용자가 '%' 기호를 추가할 필요 없이 이를 수행하는 또 다른 방법은 코드가 있는 변수를 생성하고 변수를 실행하는 것입니다.

 DECLARE @DynamicSQL NVARCHAR(MAX) 

 SET @DynamicSQL = 
 'SELECT  name, id, xtype
 FROM dbo.sysobjects
 WHERE name LIKE ''' + @ReportParameter1 + '%''
 '

 EXEC (@DynamicSQL)

이렇게 하면 LIKE 문이 사용되는 방식을 보다 세밀하게 제어할 수 있습니다.사용자가 추가 연산자를 삽입하는 것을 원하지 않으면 최종 쿼리에 병합하기 전에 항상 영숫자가 아닌 문자를 제거하는 코드를 추가할 수 있습니다.

옵션 3

이 기능을 제어하는 ​​저장 프로시저를 만들 수 있습니다.나는 일반적으로 저장 프로시저를 SSRS의 데이터 원본으로 사용하고 동적으로 생성된 SQL을 허용하지 않는 것을 선호하지만 이는 단지 내 취향일 뿐입니다.이는 종속성 분석 검사를 수행할 때 검색 가능성에 도움이 되며 최적의 쿼리 성능을 보장할 수도 있습니다.

옵션 4

SQL 코드를 동적으로 생성하는 데 도움이 되는 .NET 코드 어셈블리를 만듭니다.나는 이것이 과잉이고 기껏해야 좋지 않은 선택이라고 생각하지만, 아마도 효과가 있을 수 있습니다.

다른 팁

당신은 시도 했습니까?

select * from Products where Description like (@SearchedDescription + '%')( % 부호 주위에 단일 따옴표를 넣는가?)

Dano, 어떤 버전의 SSR을 사용하고 있습니까? RS2000 인 경우 다중 매개 변수 목록이 공식적으로 지원되지는 않지만 해결 방법이 있습니다 ....

이렇게 넣으십시오 :

select * 
from tsStudent 
where studentName like @SName+'%'

나는 이것이 매우 오래된 것을 알고 있지만, 이것은 같은 문제를 해결하기 위해 내 검색에서 나타 났으며 여기에 설명되지 않은 솔루션을 사용하여 상처를 입었습니다. 다른 사람이 따라갈 수있는 새로운 잠재적 솔루션을 추가하고 있습니다.

작성된 대로이 솔루션은 SQL Server 2016 이상에서만 작동하지만 사용자 정의를 작성하여 이전 버전에 적응할 수 있습니다. String_split UDF, 그리고 CTE 대신 하위 퀘스트를 사용함으로써.

먼저, @searchedDescription을 데이터 세트에 join을 사용하여 단일 문자열로 매핑하십시오.

=JOIN(@SearchedDedscription, ",")

그런 다음 String_Split을 사용하여 "a, b, c, d"종류의 문자열을 테이블 구조에 매핑하십시오.

;with
SearchTerms as (
  select distinct
    Value
  from 
    string_split(@SearchedDescription, ',')
)
select distinct
  *
from
  Products
  inner join SearchTerms on
    Products.Description like SearchTerms.Value + '%'

누군가가 동일한 검색어를 여러 번 추가하면 결과 세트에서 행이 복제됩니다. 마찬가지로 단일 제품은 여러 검색어와 일치 할 수 있습니다. 추가했습니다 distinct Searchterms CTE와 기본 쿼리 모두이 부적절한 행 복제를 억제하려고 시도합니다.

쿼리가 더 복잡하다면 (다른 조인의 결과 포함) 이것은 점점 더 큰 문제가 될 수 있습니다. 이 방법의 주요 단점입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top