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