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