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
Libérer: 2025-01-22 00:19:16
original
642 Les gens l'ont consulté

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 :

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

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 :

SELECT  
    [VehicleID],
    [Name],
    STRING_AGG([City], ', ') AS Locations
FROM   
    [Vehicle] V
JOIN
    [Location] L ON V.VehicleID = L.VehicleID
GROUP BY
    [VehicleID], [Name]
Copier après la connexion

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

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

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 :

SELECT 
    VehicleID, 
    Name, 
    dbo.JoinRows((SELECT City FROM Location WHERE VehicleID = Vehicle.VehicleID), ',') AS Locations
FROM Vehicle;
Copier après la connexion

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