Aracılığıyla paylaş


STRING_AGG (Transact-SQL)

Şunlar için geçerlidir: SQL Server 2017 (14.x) ve üzeri Azure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft FabricAmbarı'nda Azure Synapse AnalyticsSQL analytics uç noktası

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ı

Sözdizimi

STRING_AGG ( expression , separator ) [ <order_clause> ]

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

Bağımsız değişken

ifade

Herhangi bir türde ifadesi. İ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.

ayırıcı

Birleştirilmiş dizeler için ayırıcı olarak kullanılan nvarchar veya varchar türünde bir 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 ifadelerinin 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ü Sonuç
nvarchar(max) nvarchar(max)
varchar(max) varchar(max)
nvarchar(1..4000) nvarchar(4000)
varchar(1..8000) varchar(8000)
, bigint, smallint, tinyint, sayısal, float, gerçek, bit,
ondalık, smallmoney, money, datetime, datetime2
nvarchar(4000)

Açıklamalar

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 türü varcharise, ayırıcı nvarcharyazılamaz.

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 Börneğinde gösterildiği gibi işlevini kullanın.

STRING_AGG herhangi bir uyumluluk düzeyinde kullanılabilir.

Not

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

Örnekler

Bu makaledeki Transact-SQL kod örnekleri, Microsoft SQL Server Örnekleri ve Topluluk Projeleri giriş sayfasından indirebileceğiniz AdventureWorks2022 veya AdventureWorksDW2022 ö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
...

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

Not

SQL Server Management Studio Sorgu Düzenleyicisi kullanılıyorsa, Sonuçları Kılavuza 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ış adların listesini oluşturma

Aşağıdaki örnek null değerleri 'YOK' ile değiştirir 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(FirstName, 'N/A')), ',') AS csv
FROM Person.Person;
GO

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

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

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

Not

Management Studio Sorgu Düzenleyicisi kullanılıyorsa, Sonuçları Kılavuza seçeneği satır başı uygulayamaz. Sonuç kümesini düzgün şekilde görmek için Sonuçlar'a Metin geçin.

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 başlık Etiketler
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

SELECT listesindeki tek öğe STRING_AGG işlevi değilse GROUP BY 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

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

Not

Sonuçlar kırpılmış olarak gösterilir.

Şehir e-postalar
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

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

Not

Sonuçlar kırpılmış olarak gösterilir.

Şehir E-postalar
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;...