Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir: SQL Server 2017 (14.x) ve sonraki sürümler
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
SQL analytics endpoint in Microsoft Fabric
Warehouse 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.
D. İlgili etiketlerle haber makalelerini döndürme
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; ... |