2016-09-06 4 views
1

전적으로 SQL에 익숙하지 않습니다. 연구를하면서 아래에 나와있는 문제를 발견했습니다.In() 연산자가 작동하지 않습니다.

쿼리를 실행하면 125,130,131으로 출력됩니다. 그 출력을 @issueid 변수에 저장합니다. 내가 @issueid='125'를 전달하면 내가 더 출력을 보여줍니다 @issueid='125,130,131'을 전달하면 나는 결과

  • 을 얻을

    • : 나는 아래 쿼리에 @issueid 변수를 사용할 때

      declare @issueid varchar(100) 
      
      set @issueid = (
          SELECT STUFF(
            (
             SELECT ','+convert(varchar,ism_id) 
             FROM table where ism_group_name='TEST_COPY' 
             FOR XML PATH('') 
            ) ,1,1,'')) 
      

      는하지만 이상한 행동을 얻는다.

    내 쿼리 :

    SELECT * 
    FROM 
        ISSUE_MASTER (NOLOCK), 
        ORDER_ENTRY_PPDI (NOLOCK) 
    WHERE ISM_ID= OE_ISSUE_ID 
        and ism_id=oe_issue_id 
        and convert(varchar,oe_issue_id) in (@issueid) 
        AND ISM_STATUS = 0 
    GROUP BY ISM_ISSUER_NAME,ISM_ISSUE_NAME,OE_ISSUE_ID 
    

    이 도와주세요! 내가 뭘 잘못하고 있니?

  • +2

    마지막으로 Integer 데이터 유형으로 사용할 때 정수 값을 문자열로 연결하는 이유는 무엇입니까? 대신 테이블 변수를 사용하여 문제 ID를 캡처 한 다음 두 번째 쿼리에서 사용하십시오. –

    +1

    변수'@ issueid'는 제공하신 검색어가 아닌 다른 곳에 필요합니까? 그렇지 않다면, 변수에 값을 저장하지 않고 테이블'table'에 직접 결합합니다. – Aquillo

    답변

    1

    특정 문제에 대해 동적 SQL을 사용할 수 있지만 @Aquillo는 좋은 방법이 아니라고 설명했습니다.

    SELECT im.*, 
         oe.* 
    FROM ISSUE_MASTER im (NOLOCK), 
    INNER JOIN ORDER_ENTRY_PPDI oe (NOLOCK) 
        ON im.ISM_ID= oe.OE_ISSUE_ID 
    INNER JOIN [table] t 
        ON oe.oe_issue_id = t.ism_id 
    WHERE ISM_STATUS = 0 
        AND ism_group_name='TEST_COPY' 
    GROUP BY ISM_ISSUER_NAME,ISM_ISSUE_NAME,OE_ISSUE_ID 
    

    또 다른 해결책은 XML의 도움으로 테이블에 @issueid을 번역하고 결국에 참여하는 것입니다 :

    DECLARE @x xml 
    
    SELECT @x = CAST('<v>'+REPLACE(@issueid,',','</v><v>')+'</v>' as xml) 
    
    SELECT im.*, 
         oe.* 
    FROM ISSUE_MASTER im (NOLOCK), 
    INNER JOIN ORDER_ENTRY_PPDI oe (NOLOCK) 
        ON im.ISM_ID= oe.OE_ISSUE_ID 
    INNER JOIN (
         SELECT t.v.value('.','int') as ism_id 
         FROM @x.nodes('/v') as t(v) 
        ) t 
        ON oe.oe_issue_id = t.ism_id 
    WHERE ISM_STATUS = 0 
        AND ism_group_name='TEST_COPY' 
    GROUP BY ISM_ISSUER_NAME,ISM_ISSUE_NAME,OE_ISSUE_ID 
    
    은 쉼표로 구분 된 매개 변수를하지 않고, 당신이 필요로하는 테이블 첫 번째 테이블에 가입하는 것이 좋습니다

    동적 SQL :

    DECLARE @sql nvarchar(max) 
    
    @sql = N' 
    SELECT * 
    FROM ISSUE_MASTER im (NOLOCK), 
    INNER JOIN ORDER_ENTRY_PPDI oe (NOLOCK) 
        ONim.ISM_ID= oe.OE_ISSUE_ID 
    WHERE convert(varchar,oe_issue_id) in ('[email protected]+') 
        AND ISM_STATUS = 0 
    GROUP BY ISM_ISSUER_NAME,ISM_ISSUE_NAME,OE_ISSUE_ID' 
    
    EXEC sp_executesql @sql 
    

    참고 : 별칭을 사용하고 새 스타일 조인을 사용하십시오.

    +0

    이 방법이 효과적 일지는 모르지만 주어진 문제를 다루는 가장 좋은 방법은 아닙니다. 결과 문자열에서 단일 값을 검색하기 위해서만 OP를 추천합니다. – Aquillo

    +0

    @Aquillo 쉼표로 구분 된 매개 변수를 만들지 않고 첫 번째 테이블을 대상 테이블에 조인하는 것이 좋습니다. 또는 OP는'@ issueid'를 xml의 도움으로 테이블로 변환하고 결합 할 수 있습니다. – gofr1

    +0

    바로 그 뜻입니다. OP의 질문에 대한 답변을 주셨을지라도, OP에서 선택한 '잘못된'(최선은 아니지만) 접근 방식의 문제가 있으며, 이는 답변에서 다루지 않습니다. – Aquillo

    관련 문제