SQL Server 2017 – STRING_AGG ()

By | 20 December 2017

Selamlar,

Bugün sizlere SQL Server 2017 ile hayatımıza girmiş yeni bir T-SQL fonksiyonundan bahsediyor olacağım.

Fonksiyon açıklamasının daha net anlaşılması için basit bir örnek üzerinden devam etmek istiyorum. Örneğin, bazı insanlar birkaç e-posta adresine veya birkaç telefon numarasına sahip olduklarında, tüm bu e-postaları ve telefon numaralarını içeren bir rapor yazdırmak istiyoruz.

Önceden bunu bazı FOR XML PATH ile gerçekleştirebiliyorduk. SQL Server 2017 ile bu işlem FOR XML PATH ’e göre daha başarılı ve daha hızlı daha performanslı bir fonksiyon ile yapabilir olduk.

Örnek için aşağıdaki scripti çalıştırabilirsiniz.

use tempdb
go
drop table if exists Names
create table Names
(
Name varchar(50)
)
go
insert into Names values ('Çağlar'), ('Musa'), ('Bora') ,('Murat') , ('Kürşad') , ('İsa') , ('Ali') 

select * from Names;

 

For Xml Path ile kullanım ;

select STUFF((select ',' + [name] as [text()] from names for xml path('')),1,1,'')

STRING_AGG ile kullanımı ;

select STRING_AGG(name,',' ) from Names 

Örneğimizi biraz daha büyütelim ve AdventureWorks2014 isimli Microsoft’un Sample veritabanınnda benzer bir sorgu ile sorgulama yapalım.

select lastname,string_agg(emailaddress,', ') email from person.person, person.EmailAddress where person.BusinessEntityID=EmailAddress.BusinessEntityID group by lastname

Yukarıda ki sorguyu çalıştırdığınızda istediğiniz sorgu sonucu yerine size aşağıdaki gibi bir hata mesajı verecektir.

Hata mesajının vermesinin sebebi string_agg() fonksiyonu maksimum 8000 karakter uzunluğunda sonuç döndürecektir. Çözüm için ise aynı sorguyu Cast kullanarak revize etmemiz gerekiyor.

 select lastname,string_agg(cast(emailaddress as varchar(max)),', ') email from person.person, person.EmailAddress where person.BusinessEntityID=EmailAddress.BusinessEntityID group by lastname 

Yukarıdaki resimde de görüldüğü gibi kullanıcıların soyad bilgileri geldi, yanlarında ise birden fazla tanımlanmış mail adresi bilgilerini aralarında “virgül” ile ayrılmış olarak görüyoruz. Sorgumuzda yer alan string_agg(cast(emailaddress as varchar(max)),‘, ‘) bölümüne istediğiniz ayraç tanımlaması yapılabilir. Örnek noktalı virgül kullandım.

 


Share

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.