Dela via


STRING_AGG (Transact-SQL)

gäller för: SQL Server 2017 (14.x) och senare Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSQL-analysslutpunkt i Microsoft FabricWarehouse 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 ] )

Argument

uttryck

Ett uttryck av vilken typ som helst. Uttryck konverteras till nvarchar eller varchar typer under sammanfogning. Icke-strängtyper konverteras till nvarchar typ.

avgränsare

Ett uttryck av nvarchar eller varchar typ 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 sortering av 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ängtypen (nvarchar, varchar) är resultattypen samma som indatatypen. I följande tabell visas automatiska konverteringar:

Typ av indatauttryck Resultat
nvarchar(max) nvarchar(max)
varchar(max) varchar(max)
nvarchar(1...4000) nvarchar(4000)
varchar(1..8000) varchar(8000)
int, bigint, smallint, tinyint, numeriska, float, verklig, bit,
decimal, smallmoney, money, datetime, datetime2
nvarchar(4000)

Anmärkningar

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 typ varcharkan 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 funktionen ISNULL enligt exempel B.

STRING_AGG är tillgängligt på valfri kompatibilitetsnivå.

Not

<order_clause> är tillgängligt med databaskompatibilitetsnivå 110 och senare.

Exempel

I Transact-SQL kodexempel i den här artikeln används AdventureWorks2022- eller AdventureWorksDW2022-exempeldatabasen, som du kan ladda ned från Microsoft SQL Server-exempel och Community Projects startsida.

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.

Not

Om du använder SQL Server Management Studio Query Editor kan alternativet Results to Grid 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 med namn avgränsade med kommatecken utan NULL värden

I följande exempel ersätts null-värden med "N/A" och namnen som avgränsas med kommatecken i en enda resultatcell returneras.

USE AdventureWorks2022;
GO

SELECT STRING_AGG(CONVERT (NVARCHAR (MAX), ISNULL(FirstName, 'N/A')), ',') AS csv
FROM Person.Person;
GO

Här är en trimmad resultatuppsättning.

csv
-----
Syed,Catherine,Kim,Kim,Kim,Hazem,Sam,Humberto,Gustavo,Pilar,Pilar, ...

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

Not

Om du använder Management Studio-frågeredigeraren kan alternativet Resultat till rutnät inte implementera vagnreturen. Växla till Resultat till Text för att se resultatet korrekt inställt.

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

Not

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 resultatuppsättningen.

Not

Resultaten visas trimmade.

Stad e-postmeddelanden
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 resultatuppsättningen.

Not

Resultaten visas trimmade.

Stad E-postmeddelanden
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;...