Maison >base de données >tutoriel mysql >Comment puis-je combiner plusieurs lignes de sous-requête en un seul champ délimité dans SQL Server ?

Comment puis-je combiner plusieurs lignes de sous-requête en un seul champ délimité dans SQL Server ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-22 00:19:16645parcourir

How Can I Combine Multiple Subquery Rows into a Single Delimited Field in SQL Server?

SQL Server : combinaison de plusieurs lignes de sous-requête en un seul champ délimité

Cet article explore plusieurs méthodes pour concaténer les lignes d'une sous-requête dans un seul champ délimité dans SQL Server. Nous examinerons les techniques adaptées aux différentes versions de SQL Server.

Méthode 1 : POUR XML PATH (SQL Server 2005 et versions ultérieures)

Cette approche classique utilise FOR XML PATH pour concaténer efficacement les résultats :

<code class="language-sql">SELECT 
    [VehicleID],
    [Name],
    STUFF((SELECT ', ' + [City]
           FROM [Location]
           WHERE (VehicleID = Vehicle.VehicleID)
           FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '') AS Locations
FROM [Vehicle]</code>

Méthode 2 : STRING_AGG (SQL Server 2017 et versions ultérieures)

Pour les versions plus récentes de SQL Server, STRING_AGG fournit une solution plus lisible et souvent plus rapide :

<code class="language-sql">SELECT  
    [VehicleID],
    [Name],
    STRING_AGG([City], ', ') AS Locations
FROM   
    [Vehicle] V
JOIN
    [Location] L ON V.VehicleID = L.VehicleID
GROUP BY
    [VehicleID], [Name]</code>

Notez l'utilisation d'un JOIN ici pour des performances améliorées par rapport à une sous-requête dans ce cas précis.

Méthode 3 : Fonction personnalisée (toutes les versions de SQL Server)

Pour une réutilisabilité maximale dans différentes versions et scénarios de SQL Server, une fonction personnalisée offre une flexibilité :

<code class="language-sql">CREATE FUNCTION dbo.JoinRows (@Subquery NVARCHAR(MAX), @Delimiter NVARCHAR(1))
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @Result NVARCHAR(MAX) = '';
    DECLARE @Row NVARCHAR(MAX);
    DECLARE @NextRow CURSOR;

    SET @NextRow = CURSOR FOR SELECT [Value] FROM OPENROWSET('SQLNCLI', 'Server=(local);Trusted_Connection=yes;', @Subquery);

    OPEN @NextRow;
    FETCH NEXT FROM @NextRow INTO @Row;

    WHILE @@FETCH_STATUS = 0
    BEGIN
        SET @Result += @Row + @Delimiter;
        FETCH NEXT FROM @NextRow INTO @Row;
    END;

    CLOSE @NextRow;
    DEALLOCATE @NextRow;

    RETURN STUFF(@Result, LEN(@Result), LEN(@Delimiter), ''); -- Remove trailing delimiter
END;
GO</code>

Cette fonction utilise OPENROWSET pour exécuter la sous-requête dynamique. C'est plus sûr que d'exécuter directement du SQL dynamique. La fonction peut alors être utilisée comme ceci :

<code class="language-sql">SELECT 
    VehicleID, 
    Name, 
    dbo.JoinRows((SELECT City FROM Location WHERE VehicleID = Vehicle.VehicleID), ',') AS Locations
FROM Vehicle;</code>

Choisissez la méthode qui correspond le mieux à votre version de SQL Server et à vos exigences de performances. Pour SQL Server 2017 et versions ultérieures, STRING_AGG est généralement recommandé pour sa simplicité et ses performances. Pour les anciennes versions, ou pour des scénarios plus complexes, la fonction personnalisée fournit une solution robuste et réutilisable.

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:
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