> 데이터 베이스 > MySQL 튜토리얼 > FOR XML 또는 CLR 함수를 사용하지 않고 SQL Server에서 여러 행의 문자열을 어떻게 효율적으로 연결할 수 있습니까?

FOR XML 또는 CLR 함수를 사용하지 않고 SQL Server에서 여러 행의 문자열을 어떻게 효율적으로 연결할 수 있습니까?

DDD
풀어 주다: 2025-01-20 09:12:11
원래의
919명이 탐색했습니다.

How Can I Efficiently Concatenate Strings from Multiple Rows in SQL Server Without Using FOR XML or CLR Functions?

SQL Server 문자열 연결 방법

문제 설명:

여러 줄의 문자열을 한 줄로 모아야 합니다. COALESCE 및 FOR XML은 필요한 작업을 수행하지 않으며 Azure는 CLR 정의 집계 함수를 지원하지 않습니다. 최선의 대안을 찾아야 합니다.

해결책:

표준 Transact SQL을 사용하면 다음 단계에 따라 문자열을 효율적으로 연결할 수 있습니다.

  1. 번호가 매겨진 행: 그룹화 기준에 따라 데이터를 분할하고 각 분할 내에 행 번호를 할당합니다.
  2. 재귀 조인: 줄 번호를 기준으로 조인 문자열을 반복하는 재귀 CTE를 만듭니다.
  3. 결과 필터링: 라인 번호가 가장 높은 결과만 선택되어 완전한 연결을 보장합니다.

지침:

이 방법은 세 가지 CTE를 사용합니다.

  • 파티션됨: 각 파티션 내의 행에 행 번호를 할당합니다.
  • 연결: 연결된 문자열을 재귀적으로 작성합니다.
  • 최종 결과: 전체 결과만 포함하도록 연결된 행을 필터링합니다.

이 솔루션을 사용하려면 그룹화 및 정렬 기준을 지정해야 합니다. 예를 들어 귀하의 경우 동일한 ID를 가진 행이 연결되어 알파벳순으로 정렬됩니다.

예:

다음 데이터를 고려하세요.

<code>ID  Name
-- --
1   Matt
1   Rocks
2   Stylus
3   Foo
3   Bar
3   Baz</code>
로그인 후 복사

쿼리와 출력은 다음과 같습니다.

<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>
로그인 후 복사
<code>ID  FullName
-- ------------------------------
2   Stylus
3   Bar, Baz, Foo
1   Matt, Rocks</code>
로그인 후 복사

개선 사항 설명: 더 긴 문자열 연결 결과를 지원하려면 nvarchar 유형을 nvarchar(max)으로 변경하세요. 이렇게 하면 잠재적인 문자열 길이 오버플로 오류를 방지할 수 있습니다.

위 내용은 FOR XML 또는 CLR 함수를 사용하지 않고 SQL Server에서 여러 행의 문자열을 어떻게 효율적으로 연결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿