>데이터 베이스 >MySQL 튜토리얼 >CLR 함수 없이 SQL Server의 여러 행에서 문자열을 효율적으로 연결하는 방법은 무엇입니까?

CLR 함수 없이 SQL Server의 여러 행에서 문자열을 효율적으로 연결하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2025-01-20 09:01:08472검색

How to Efficiently Concatenate Strings from Multiple Rows in SQL Server Without CLR Functions?

SQL Server의 고성능 문자열 연결: CLR 제한 우회

여러 행의 문자열을 단일 문자열로 집계하는 것은 SQL Server에서 자주 수행되는 작업입니다. COALESCE, FOR XML PATH 같은 방법이 존재하지만 효율성 측면에서 부족한 경우가 많습니다. 이는 CLR 기능에 대한 지원이 부족하여 일반적인 고성능 솔루션이 제거된 SQL Azure에서 특히 그렇습니다.

효과적인 대안: 재귀적 CTE 접근 방식

강력하고 효율적인 대안은 재귀적 공통 테이블 표현식(CTE)을 활용합니다. 이 기술에는 다음과 같은 주요 단계가 포함됩니다.

  1. 행 번호 지정 및 분할: 각 개별 ID 파티션 내의 각 이름에 고유한 행 번호를 할당합니다.
  2. 재귀적 문자열 집계: 순차적인 행 번호를 기준으로 파티션을 결합하여 문자열을 재귀적으로 연결합니다.
  3. 결과 필터링: 각 파티션에 대해 연결된 최종 문자열만 선택합니다.

이 방법은 명시적인 그룹화 및 정렬을 통해 일관된 결과를 보장합니다.

실제 구현:

다음은 재귀 CTE를 사용한 샘플 구현입니다.

<code class="language-sql">WITH Partitioned AS (
    SELECT 
        ID,
        Name,
        ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Name) AS NameNumber,
        COUNT(*) OVER (PARTITION BY ID) AS NameCount
    FROM dbo.SourceTable
),
Concatenated AS (
    SELECT 
        ID, 
        CAST(Name AS nvarchar(max)) AS FullName, 
        Name, 
        NameNumber, 
        NameCount 
    FROM Partitioned 
    WHERE NameNumber = 1
    UNION ALL
    SELECT 
        P.ID, 
        CAST(C.FullName + ', ' + P.Name AS nvarchar(max)), 
        P.Name, 
        P.NameNumber, 
        P.NameCount
    FROM Partitioned AS P
        INNER JOIN Concatenated AS C 
            ON P.ID = C.ID 
            AND P.NameNumber = C.NameNumber + 1
)
SELECT 
    ID,
    FullName
FROM Concatenated
WHERE NameNumber = NameCount;</code>

이 재귀 CTE는 특히 CLR 기능을 사용할 수 없는 환경에서 SQL Server의 문자열 연결을 위한 확장 가능하고 효율적인 솔루션을 제공합니다. 잠재적으로 큰 연결 문자열을 처리하려면 nvarchar(max)을 사용하세요.

위 내용은 CLR 함수 없이 SQL Server의 여러 행에서 문자열을 효율적으로 연결하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.