Aracılığıyla paylaş


STRING_AGG (Transact-SQL)

Şunlar için geçerlidir: SQL Server 2017 (14.x) ve sonraki sürümler Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSQL analytics endpoint in Microsoft FabricWarehouse SQL databasein Microsoft Fabric

Dize ifadelerinin değerlerini birleştirir ve aralarına ayırıcı değerler yerleştirir. Ayırıcı dizenin sonuna eklenmez.

Transact-SQL söz dizimi kuralları

Syntax

STRING_AGG ( expression , separator ) [ <order_clause> ]

<order_clause> ::=
    WITHIN GROUP ( ORDER BY <order_by_expression_list> [ ASC | DESC ] )

Arguments

expression

Herhangi bir türde bir ifade . İfadeler birleştirme sırasında nvarchar veya varchar türlerine dönüştürülür. Dize olmayan türler nvarchar türüne dönüştürülür.

separator

Birleştirilmiş dizeler için ayırıcı olarak kullanılan nvarchar veya varchar türünün ifadesi. Değişmez değer veya değişken olabilir.

<order_clause>

İsteğe bağlı olarak, WITHIN GROUP yan tümcesini kullanarak birleştirilmiş sonuçların sırasını belirtin:

WITHIN GROUP ( ORDER BY <order_by_expression_list> [ ASC | DESC ] )
  • <order_by_expression_list>

    Sonuçları sıralamak için kullanılabilecek sabit olmayan ifadelerin listesi. Sorgu başına yalnızca bir <order_by_expression_list> izin verilir. Varsayılan sıralama düzeni artan düzendedir.

Dönüş türleri

Dönüş türü ilk bağımsız değişkene (ifade) bağlıdır. Giriş bağımsız değişkeni dize türüyse (nvarchar, varchar), sonuç türü giriş türüyle aynıdır. Aşağıdaki tabloda otomatik dönüştürmeler listelenir:

Giriş ifade türü Result
nvarchar(max) nvarchar(max)
varchar(max) varchar(max)
nvarchar(1..4000) nvarchar(4000)
varchar(1..8000) varchar(8000)
int, bigint, smallint, tinyint, sayısal, float, real, bit,
ondalık, küçük para, para, tarih zamanı, tarih saati2
nvarchar(4000)

Remarks

STRING_AGG, tüm ifadeleri satırlardan alan ve bunları tek bir dizede bir araya getiren bir toplama işlevidir. İfade değerleri örtük olarak dize türlerine dönüştürülür ve sonra birleştirilir. Dizelere örtük dönüştürme, veri türü dönüştürmeleri için mevcut kurallara uyar. Veri türü dönüştürmeleri hakkında daha fazla bilgi için bkz. CAST ve CONVERT.

Giriş ifadesi varchar türündeyse, ayırıcı nvarchar türü olamaz.

Null değerler yoksayılır ve karşılık gelen ayırıcı eklenmez. Null değerler için yer tutucu döndürmek için ISNULL gösterildiği gibi işlevini kullanın.

STRING_AGG herhangi bir uyumluluk düzeyinde kullanılabilir.

Note

<order_clause>, veritabanı uyumluluk düzeyi 110 ve üzeri ile kullanılabilir.

Examples

Bu makaledeki kod örnekleri, AdventureWorks2025 giriş sayfasından indirebileceğiniz AdventureWorksDW2025 veya örnek veritabanını kullanır.

A. Yeni satırlarla ayrılmış ad listesi oluşturma

Aşağıdaki örnek, tek bir sonuç hücresinde, satır başıyla ayrılmış bir ad listesi oluşturur.

USE AdventureWorks2022;
GO

SELECT STRING_AGG(CONVERT (NVARCHAR (MAX), FirstName), CHAR(13)) AS csv
FROM Person.Person;
GO

Sonuç kümesi aşağıdadır.

csv
-----------
Syed
Catherine
Kim
Kim
Kim
Hazem
...

NULL hücrelerde bulunan name değerleri sonuç olarak döndürülmüyor.

Note

SQL Server Management Studio Sorgu Düzenleyicisi'ni kullanırsanız, Kılavuza Sonuçlar seçeneği satır başı uygulayamaz. Sonuç kümesini düzgün şekilde görmek için Sonuçlar'a Metin geçin. Metin sonuçları varsayılan olarak 256 karaktere yuvarlanır. Bu sınırı artırmak için, Her sütunda görüntülenen karakter sayısı üst sınırı seçeneğini değiştirin.

B. NULL değerleri olmadan virgülle ayrılmış ikinci adların listesini oluşturma

Aşağıdaki örnek, değerleri ile NULL değiştirir N/A ve adları tek bir sonuç hücresinde virgülle ayrılmış olarak döndürür.

USE AdventureWorks2022;
GO

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

Aşağıda kırpılmış bir sonuç kümesi yer alır.

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. Virgülle ayrılmış değerler oluşturma

USE AdventureWorks2022;
GO

SELECT STRING_AGG(CONVERT (NVARCHAR (MAX), CONCAT(FirstName, ' ', LastName, '(', ModifiedDate, ')')), CHAR(13)) AS names
FROM Person.Person;
GO

Aşağıda kırpılmış bir sonuç kümesi yer alır.

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

SQL Server Management Studio Sorgu Düzenleyicisi'ni kullanırsanız, Kılavuza Sonuçlar seçeneği satır başı uygulayamaz. Sonuç kümesini düzgün şekilde görmek için Sonuçlar'a Metin geçin. Metin sonuçları varsayılan olarak 256 karaktere yuvarlanır. Bu sınırı artırmak için, Her sütunda görüntülenen karakter sayısı üst sınırı seçeneğini değiştirin.

Makalelerin ve etiketlerinin farklı tablolara ayrıldığı bir veritabanı düşünün. Geliştirici, ilişkili tüm etiketlerle her makale için bir satır döndürmek istiyor. Aşağıdaki sorgu bu sonucu elde eder:

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

Sonuç kümesi aşağıdadır.

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

GROUP BY listesindeki tek öğe STRING_AGG işlevi değilse SELECT yan tümcesi gereklidir.

E. Şehir başına e-posta listesi oluşturma

Aşağıdaki sorgu çalışanların e-posta adreslerini bulur ve bunları şehre göre gruplandırr:

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

Kırpılan sonuç kümesi aşağıdadır.

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-posta sütununda döndürülen e-postalar, belirli şehirlerde çalışan kişi grubuna e-posta göndermek için doğrudan kullanılabilir.

F. Şehir başına sıralanmış bir e-posta listesi oluşturma

Önceki örneğe benzer şekilde, aşağıdaki sorgu çalışanların e-posta adreslerini bulur, bunları şehre göre gruplar ve e-postaları alfabetik olarak sıralar:

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

Kırpılan sonuç kümesi aşağıdadır.

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