>source

임시 테이블을 만들었습니다. 반복해서 반복하고 모든 레코드를 동일한 전자 메일 주소로 일치시킨 다음 문자열을 채운 다음 전자 메일로 이동 한 다음 테이블을 삭제합니다. 저장 프로 시저로 실행됩니다.

모든 고유 이메일 주소를 먼저 잡고 레코드를 통합하는 커서를 사용했지만 잠재적으로 100k-500k 레코드의 성능은 수용 할 수 없으며 훨씬 더 효율적인 방법이 있어야한다는 것을 알고 있습니다. .

예제 데이터 (사과, 올바른 형식 지정 방법을 모르는 경우)

#temptable
temp_email, temp_string
test@test.com string1
test@test.com string2
test2@test.com string3
test2@test.com string4
test3@test.com string5

그런 다음이 데이터로 다른 테이블을 채우고 싶습니다

emailto...   emailbody
test@test.com   'string1<br / > string2'
test2@test.com   'string3<br / > string4'
test3@test.com   'string5'

감사합니다.


  • 답변 # 1

    와이즈 비즈  그리고 STUFF  이 방법은 SQl Server 2014 및 이전 버전에서이를 훌륭하게 수행합니다. 문자 FOR XML PATH 가 있기 때문에  그리고 <  그러나 나중에 '탈출되지 않아야'합니다.

    >
    
    

  • 답변 # 2

    커서를 사용할 필요가 없습니다. string_agg 함수를 사용하십시오.

    WITH VTE AS(
        SELECT *
        FROM (VALUES('test@test.com','string1'),
                    ('test@test.com','string2'),
                    ('test2@test.com','string3'),
                    ('test2@test.com','string4'),
                    ('test3@test.com','string5')) V(Email, String))
    SELECT Email,
           STUFF(REPLACE(REPLACE((SELECT '<br/>' + sq.String
                                  FROM VTE sq
                                  WHERE sq.Email = V.Email
                                  FOR XML PATH('')),'&lt;','<'),'&gt;','>'),1,5,'')
    FROM VTE V
    GROUP BY Email;
    
    

  • 답변 # 3

    SQL Server 2014에는 커서없이이 작업을 수행 할 수있는 방법이 있지만 기본적으로 상당히 복잡한 해킹이며 읽을 수없는 SQL로 이어집니다. 자세한 내용은 여기를 참조하십시오 :

    SQL 서버에서 여러 행의 텍스트를 단일 텍스트 문자열로 연결하는 방법은 무엇입니까?

    커서가 적어도 읽기 가능하기 때문에 SQL 2014에서 가장 좋은 방법은 확실합니다.

    Sql Server 2017에는이를위한 공식 집계 기능이 있습니다 :

    String_Agg

    ...하지만 그게 당신에게 아무 소용이 없습니다. 죄송합니다.

  • 답변 # 4

    다음과 같은 작업을 수행 할 수 있습니다.

    Create table #temptable 
    (temp_email varchar(50), temp_string varchar(50))
    INSERT INTO #temptable
    VALUES ('test@test.com', 'string1'),
    ('test@test.com', 'string2'),
    ('test2@test.com', 'string3'),
    ('test2@test.com', 'string4'),
    ('test3@test.com', 'string5')
    
    Select temp_email, STRING_AGG(temp_string,' <br/>')
    from #temptable
    Group by temp_email
    
    
    -- Create temp table CREATE TABLE #temptable (temp_email varchar(50), temp_string varchar(50)) -- populate table with data INSERT INTO #temptable VALUES ('test@test.com', 'string1'), ('test@test.com', 'string2'), ('test2@test.com', 'string3'), ('test2@test.com', 'string4'), ('test3@test.com', 'string5') -- actual query ;WITH CTE_table AS( SELECT C.temp_email, REPLACE(REPLACE(STUFF( (SELECT CAST(temp_string AS VARCHAR(20))+'<br/>' AS [text()] FROM #temptable AS O WHERE C.temp_email= o.temp_email FOR XML PATH('')), 1, 0, NULL) ,'&lt;','<') -- replace this < with html code &lt; ,'&gt;','>') -- replace this > with html code &gt; AS temp_string ,ROW_NUMBER() OVER (partition by temp_email order by temp_email) rownumber FROM #temptable AS C ) -- Get only unique records SELECT temp_email,temp_string FROM CTE_table Where rownumber=1

관련 자료

  • 이전 여러 검색어가 포함 된 Elasticsearch Nester_filter
  • 다음 php - 모든 API 요청 및 응답 기록 + Slim 프레임 워크