Maison > base de données > tutoriel mysql > Comment concaténer efficacement des chaînes de plusieurs lignes dans SQL Server sans fonctions CLR ?

Comment concaténer efficacement des chaînes de plusieurs lignes dans SQL Server sans fonctions CLR ?

Susan Sarandon
Libérer: 2025-01-20 09:01:08
original
481 Les gens l'ont consulté

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

Concaténation de chaînes hautes performances dans SQL Server : contourner les limitations du CLR

L'agrégation de chaînes de plusieurs lignes en une seule chaîne est une tâche fréquente de SQL Server. Bien que des méthodes comme COALESCE et FOR XML PATH existent, elles ne sont souvent pas efficaces en termes d'efficacité. Cela est particulièrement vrai dans SQL Azure, qui ne prend pas en charge les fonctions CLR, éliminant ainsi une solution commune hautes performances.

Alternatives efficaces : approche CTE récursive

Une alternative robuste et efficace exploite une expression de table commune (CTE) récursive. Cette technique implique ces étapes clés :

  1. Numérotation et partitionnement des lignes : Attribue un numéro de ligne unique à chaque nom dans chaque partition d'ID distincte.
  2. Agrégation récursive de chaînes : Concatène récursivement les chaînes en joignant des partitions en fonction de numéros de ligne séquentiels.
  3. Filtrage des résultats : Sélectionne uniquement la chaîne concaténée finale pour chaque partition.

Cette méthode garantit des résultats cohérents grâce à un regroupement et un tri explicites.

Mise en œuvre pratique :

Voici un exemple d'implémentation utilisant un CTE récursif :

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;
Copier après la connexion

Ce CTE récursif fournit une solution évolutive et efficace pour la concaténation de chaînes dans SQL Server, en particulier dans les environnements où les fonctions CLR ne sont pas disponibles. Notez l'utilisation de nvarchar(max) pour gérer des chaînes concaténées potentiellement volumineuses.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal