2016-12-21 1 views
0

동적 SQL에 구현 된 저장 프로 시저가 있습니다. IN 키워드를 포함시키고 작은 따옴표 사이의 목록에 고정 값을 전달하려고합니다.동적 SQL의 IN 키워드

나는 이런 식으로 뭔가 쓰고 싶은 :

where grp.Status in ('A,S') 

을하지만, 위의 문은 이미 작은 따옴표로 캡슐화된다.

나는 아래와 같은 것을 사용하여 시도 :

where grp.Status in (' +QUOTENAME('A,S','''')+ 

하지만 쿼리는 목록 즉 'A'에서 첫 번째 값을 인식한다.

또한 스플릿 함수를 사용하여 임시 테이블에 값을 저장하고 대신 임시 테이블의 열을 사용하는 방법에 대해 읽었습니다. 그러나, 나는 작은 목록을 위해 그 과정을 수행하는 것이 아니다.

모든 제안과 해결책은 대단히 감사하겠습니다.

where grp.Status in ('A','S') . . . 

답변

2

당신은 방금 SQL에 목록을 넣을 수 있습니다 split 함수를 사용하면 동적 SQL에서 다음을 수행 할 수 있습니다.

declare @xml xml 
     , @list Varchar(100) = 'A,B' 

set @xml = N'<root><r>' + replace(@list, ',' ,'</r><r>') + '</r></root>' 

Declare @Sql Nvarchar(MAX); 

SET @Sql = N'Select * from TableName grp 
      WHERE grp.Status IN (
            select r.value(''.'',''varchar(max)'') as item 
            from @xml.nodes(''//root/r'') as records(r) 
           )' 

Exec sp_executesql @Sql 
        ,N'@xml XML' 
        ,@xml 
+0

우리의 데이터베이스는 이와 비슷한 것을 처리하지만, 좋은 주인은 그것을 읽을 수없는 혼란에 빠지게 만듭니다. – levelonehuman

+2

@levelonehuman, 그 이유는 분할 기능을 사용하고 테이블에 가입하는 것이 유지하기가 훨씬 쉽기 때문입니다. – HLGEM

0

당신이 사용하지 않는 경우 : 바로,이 같은 결과를 생성해야 그 작은 따옴표를 가지고있는 경우

'where grp.Status in (''' + replace('A,S', ',', ''',''') + ''') . . . 

: