2013-08-14 2 views
1

을 통해 다음 루프는 기본적으로 I 행에서 다시 선택을이 행 값을분할 문자열, 결과

hello;my;apple;world;is;good 

을 그리고 얻을 수 있어야합니다.

하지만 분명히이 쿼리는 mytable의 select mycolumn에서 가져옵니다. 안녕하세요

    • 사과
    • 세계
    • 좋은
    다음

    커서 루프

    에 그것을 던져 할 수있는 방법이 있나요 이것과 함께있는이 선택;

    DECLARE 
    TCursor CURSOR FOR 
        //select split here? 
    OPEN TCursor ; 
    FETCH NEXT FROM TCursor ; 
    
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
        FETCH NEXT FROM TCursor ; 
    END; 
    
    CLOSE TCursor ; 
    DEALLOCATE TCursor ; 
    GO 
    
  • 답변

    1

    스플릿 기능을 만듭니다. (후행 ; 처리하도록 업데이트, 시나리오는 질문에 설명되지 않음) :

    CREATE FUNCTION dbo.SplitStrings_XML 
    (
        @List  NVARCHAR(MAX), 
        @Delimiter NVARCHAR(255) 
    ) 
    RETURNS TABLE 
    WITH SCHEMABINDING 
    AS 
        RETURN 
        ( 
         SELECT Item FROM 
         ( 
         SELECT Item = RTRIM(y.i.value('.[1]', 'nvarchar(4000)')) 
         FROM 
         ( 
          SELECT x = CONVERT(XML, '<i>' 
          + REPLACE(@List, @Delimiter, '</i><i>') 
          + '</i>').query('.') 
         ) AS a CROSS APPLY x.nodes('i') AS y(i) 
        ) AS x WHERE LEN(Item) > 0 
        ); 
    GO 
    

    이 그럼 당신은이 중 하나를 말할 수 있습니다 :

    --DECLARE TCursor LOCAL FAST_FORWARD FOR 
    
        SELECT Item FROM dbo.SplitStrings_XML('hello;my;apple;world;is;good', ';'); 
        SELECT Item FROM dbo.SplitStrings_XML('hello;my;apple;world;is;good;', ';'); 
        SELECT Item FROM dbo.SplitStrings_XML('apple;', ';'); 
    

    내 생각 엔 당신이 정말로 필요하지 않은 것입니다 커서는 여기에 있지만 루프 내에서 무엇을하는지 모른 채 안내를 제공하기는 어렵습니다.

    이 XML 함수가 독립 실행 형 답변으로 잘 작동하는 반면, better, more scalable solutions that take a little more effort이 있습니다.

    +0

    아론 - 사과 같은 단 하나의 가치가 있다면 어떻게 될까요? –

    +0

    @Mike - 시도해 보셨습니까? 문자열에 빈 문자열이 포함 된 추가 행인'foo; bar; good; '와 같은 추가 후행'; '이있는 경우에도 동일한 결과를 얻습니다. 함수에서 필터링 할 수 있습니다 (예 :'WHERE LEN (yvalue ('. [1]', 'nvarchar (4000)'))> 0' 또는 하위 쿼리를 추가하고'Item'을 확인하십시오. 커서의 길이를 확인하여이 마지막 행을 건너 뛸 수 있습니다. –