Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för: SQL Server 2017 (14.x) och senare versioner
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse AnalyticsSQL Analytics-slutpunkt
i Microsoft Fabric
Warehouse i Microsoft Fabric
Sammanfogar värdena för stränguttryck och placerar avgränsarvärden mellan dem. Avgränsaren läggs inte till i slutet av strängen.
Transact-SQL syntaxkonventioner
Syntax
STRING_AGG ( expression , separator ) [ <order_clause> ]
<order_clause> ::=
WITHIN GROUP ( ORDER BY <order_by_expression_list> [ ASC | DESC ] )
Arguments
expression
Ett uttryck av valfri typ. Uttryck konverteras till nvarchar - eller varchar-typer under sammanfogning. Icke-strängtyper konverteras till nvarchar-typ .
separator
Ett uttryck av typen nvarchar eller varchar som används som avgränsare för sammanfogade strängar. Det kan vara literal eller variabel.
<order_clause>
Du kan också ange ordningen på sammanfogade resultat med hjälp av WITHIN GROUP-satsen:
WITHIN GROUP ( ORDER BY <order_by_expression_list> [ ASC | DESC ] )
<order_by_expression_list>En lista över icke-konstanta uttryck som kan användas för att sortera resultat. Endast en
<order_by_expression_list>tillåts per fråga. Standardsorteringsordningen är stigande.
Returtyper
Returtypen beror på första argumentet (uttrycket). Om indataargumentet är strängtyp (nvarchar, varchar) är resultattypen samma som indatatypen. I följande tabell visas automatiska konverteringar:
| Typ av indatauttryck | Result |
|---|---|
| nvarchar(max) | nvarchar(max) |
| varchar(max) | varchar(max) |
| nvarchar(1..4000) | nvarchar(4000) |
| varchar(1..8000) | varchar(8000) |
|
int, bigint, smallint, tinyint, numerisk, float, real, bit, decimal, smallmoney, money, datetime, datetime2 |
nvarchar(4000) |
Remarks
STRING_AGG är en mängdfunktion som tar alla uttryck från rader och sammanfogar dem till en enda sträng. Uttrycksvärden konverteras implicit till strängtyper och sammanfogas sedan. Den implicita konverteringen till strängar följer de befintliga reglerna för datatypskonverteringar. Mer information om datatypkonverteringar finns i CAST och CONVERT.
Om indatauttrycket är typvarchar kan avgränsaren inte vara typ nvarchar.
Null-värden ignoreras och motsvarande avgränsare läggs inte till. Om du vill returnera en platshållare för null-värden använder du ISNULL funktionen som visas i exempel B.
STRING_AGG är tillgängligt på valfri kompatibilitetsnivå.
Note
<order_clause> är tillgängligt med databaskompatibilitetsnivå 110 och senare.
Examples
Kodexemplen i den här artikeln använder AdventureWorks2022- eller AdventureWorksDW2022-exempeldatabasen, som du kan ladda ned från startsidan Microsoft SQL Server Samples och Community Projects.
A. Generera lista med namn avgränsade i nya rader
I följande exempel skapas en lista med namn i en enda resultatcell, avgränsad med vagnreturer.
USE AdventureWorks2022;
GO
SELECT STRING_AGG(CONVERT (NVARCHAR (MAX), FirstName), CHAR(13)) AS csv
FROM Person.Person;
GO
Här är resultatuppsättningen.
csv
-----------
Syed
Catherine
Kim
Kim
Kim
Hazem
...
NULL värden som finns i name celler returneras inte i resultatet.
Note
Om du använder SQL Server Management Studio Query Editor kan alternativet Resultat till rutnät inte implementera vagnreturen. Växla till Resultat till Text för att se resultatet korrekt inställt. Resultatet till Text trunkeras som standard till 256 tecken. Om du vill öka den här gränsen ändrar du Maximalt antal tecken som visas i varje kolumn alternativ.
B. Generera en lista över mellannamn avgränsade med kommatecken utan NULL-värden
I följande exempel ersätts NULL värden med N/A och returnerar namnen avgränsade med kommatecken i en enda resultatcell.
USE AdventureWorks2022;
GO
SELECT STRING_AGG(CONVERT (NVARCHAR (MAX), ISNULL(MiddleName, 'N/A')), ',') AS csv
FROM Person.Person;
GO
Här är en trimmad resultatuppsättning.
csv
-----
E,R.,N/A,N/A,B,E,N/A,N/A,N/A,N/A,G,B,N/A,C,J,L,P,N/A,M,N/A,N/A,N/A,L,J., ...
C. Generera kommaavgränsade värden
USE AdventureWorks2022;
GO
SELECT STRING_AGG(CONVERT (NVARCHAR (MAX), CONCAT(FirstName, ' ', LastName, '(', ModifiedDate, ')')), CHAR(13)) AS names
FROM Person.Person;
GO
Här är en trimmad resultatuppsättning.
names
-------
Ken Sánchez (Feb 8 2003 12:00AM)
Terri Duffy (Feb 24 2002 12:00AM)
Roberto Tamburello (Dec 5 2001 12:00AM)
Rob Walters (Dec 29 2001 12:00AM)
...
Note
Om du använder SQL Server Management Studio Query Editor kan alternativet Resultat till rutnät inte implementera vagnreturen. Växla till Resultat till Text för att se resultatet korrekt inställt. Resultatet till Text trunkeras som standard till 256 tecken. Om du vill öka den här gränsen ändrar du Maximalt antal tecken som visas i varje kolumn alternativ.
D. Returnera nyhetsartiklar med relaterade taggar
Föreställ dig en databas där artiklar och deras taggar är uppdelade i olika tabeller. En utvecklare vill returnera en rad per artikel med alla associerade taggar. Följande fråga uppnår det här resultatet:
SELECT a.articleId,
title,
STRING_AGG(tag, ',') AS tags
FROM dbo.Article AS a
LEFT OUTER JOIN dbo.ArticleTag AS t
ON a.ArticleId = t.ArticleId
GROUP BY a.articleId, title;
GO
Här är resultatuppsättningen.
| articleId | title | tags |
|---|---|---|
172 |
Polls indicate close election results |
politics,polls,city council |
176 |
New highway expected to reduce congestion |
NULL |
177 |
Dogs continue to be more popular than cats |
polls,animals |
Note
Satsen GROUP BY krävs om funktionen STRING_AGG inte är det enda objektet i listan SELECT.
E. Generera en lista över e-postmeddelanden per ort
Följande fråga hittar de anställdas e-postadresser och grupperar dem efter stad:
USE AdventureWorks2022;
GO
SELECT TOP 10 City,
STRING_AGG(CONVERT (NVARCHAR (MAX), EmailAddress), ';') AS emails
FROM Person.BusinessEntityAddress AS BEA
INNER JOIN Person.Address AS A
ON BEA.AddressID = A.AddressID
INNER JOIN Person.EmailAddress AS EA
ON BEA.BusinessEntityID = EA.BusinessEntityID
GROUP BY City;
GO
Här är den trimmade resultatuppsättningen.
| City | emails |
|---|---|
Ballard |
paige28@adventure-works.com;joshua24@adventure-works.com;javier12@adventure-works.com; ... |
Baltimore |
gilbert9@adventure-works.com |
Barstow |
kristen4@adventure-works.com |
Basingstoke Hants |
dale10@adventure-works.com;heidi9@adventure-works.com |
Baytown |
kelvin15@adventure-works.com |
Beaverton |
billy6@adventure-works.com;dalton35@adventure-works.com;lawrence1@adventure-works.com; ... |
Bell Gardens |
christy8@adventure-works.com |
Bellevue |
min0@adventure-works.com;gigi0@adventure-works.com;terry18@adventure-works.com; ... |
Bellflower |
philip0@adventure-works.com;emma34@adventure-works.com;jorge8@adventure-works.com; ... |
Bellingham |
christopher23@adventure-works.com;frederick7@adventure-works.com;omar0@adventure-works.com; ... |
E-postmeddelanden som returneras i e-postkolumnen kan användas direkt för att skicka e-postmeddelanden till en grupp personer som arbetar i vissa städer.
F. Generera en sorterad lista med e-postmeddelanden per ort
I likhet med föregående exempel hittar följande fråga anställdas e-postadresser, grupperar dem efter stad och sorterar e-postmeddelandena alfabetiskt:
USE AdventureWorks2022;
GO
SELECT TOP 10 City,
STRING_AGG(CONVERT (NVARCHAR (MAX), EmailAddress), ';') WITHIN GROUP (ORDER BY EmailAddress ASC) AS Emails
FROM Person.BusinessEntityAddress AS BEA
INNER JOIN Person.Address AS A
ON BEA.AddressID = A.AddressID
INNER JOIN Person.EmailAddress AS EA
ON BEA.BusinessEntityID = EA.BusinessEntityID
GROUP BY City;
GO
Här är den trimmade resultatuppsättningen.
| City | Emails |
|---|---|
Barstow |
kristen4@adventure-works.com |
Basingstoke Hants |
dale10@adventure-works.com;heidi9@adventure-works.com |
Braintree |
mindy20@adventure-works.com |
Bell Gardens |
christy8@adventure-works.com |
Byron |
louis37@adventure-works.com |
Bordeaux |
ranjit0@adventure-works.com |
Carnation |
don0@adventure-works.com;douglas0@adventure-works.com;george0@adventure-works.com; ... |
Boulogne-Billancourt |
allen12@adventure-works.com;bethany15@adventure-works.com;carl5@adventure-works.com; ... |
Berkshire |
barbara41@adventure-works.com;brenda4@adventure-works.com;carrie14@adventure-works.com; ... |
Berks |
adriana6@adventure-works.com;alisha13@adventure-works.com;arthur19@adventure-works.com; ... |