Microsoft SQL Server 2016 T-SQL yenilikləri. STRING_SPLIT

Salam Dostlar.

Microsoft SQL Server 2016 yenilikləri barədə mövzumuzu davam edirik. Transact-SQL üzrə yeniliklər barədə bu artıq üçüncü məqaləmizdir. Bu gün biz sizinlə STRING_SPLIT funksiyası ilə tanış olacağıq. Microsoft SQL Serverlə az-çox işləyənlər bu funksiyanı çoxdan gözləyirdilər. Bəlkə də ən çox gözlənilən funksiyalardan biridir. Təsəvvür edin, cədvəlin hər hansı bir sətrində və ya sətirlərində müxtəlif sözlərdən ibarət cümlələrimiz, vergüllə və ya digər işarələrlə ayrılmış açar sözlərimiz (taglarımız) ola bilər. Belə sətirdə olan sözləri bir birindən ayırmaq və onları bir sütuna düzmək üçün müxtəlif qəliz funksiyalar yazılırdı. Skalyar funksiyalarından və CLR funksiyarından istifadə olunurdu. Belə funksiyaların ən məşhurları Jeff Moden tərəfindən yazılmış DelimitedSplit8k və Adam Machanic tərəfindən yazılmış SQLCLR funksiyalarıdır. İndi belə qəliz funksiyalara artıq ehtiyac qalmadı. Lakin STRING_SPLIT funksiyası yalnız Microsoft SQL Server 2016 versiyasında çalışır və ondan aşağı olan serverlərdə köhnə üsullardan istifadə etməli olacağıq. STRING_SPLIT funksiyası istifadə etmək üçün verilənlər bazasının səviyyəsi (compatibility level) mütləq 130 olmalıdır. Bundan aşağı səviyyələrdə funksiya işləməyəcək. Məsələn belə bir vəziyyət ola bilər ki, biz SQL Server 2016 versiyaya keçid etdik, lakin mövcud olan və ya ehtiyat nüsxədən qaytarılan verilən bazaların uyğunluq səviyyəsi (compatibility level) 130-dan aşağıdır. STRING_SPLIT funksiyası istifadə etmək üçün biz verilənlər bazalarının uyğunluq səviyyəsini (compatibility level) 130-a dəyişməliyik.

STRING_SPLIT funksiyası müəyyən ayırıcı işarələrə görə mətni sözlərə bölür.

Misal 1: Cədvəlimizin sətrində belə bir mətnimiz var:  “SQL Server 2016 barədə Technet.az-dan öyrənin” Bu cümləni sözlərə ayırmaq və bu sözləri bir sütuna düzmək üçün bu formada yaza bilərik:

SELECT * 
FROM STRING_SPLIT(N'SQL Server 2016 barədə Technet.az-dan öyrənin', ' ');

Yazılışı çox asandır. STRING_SPLIT funksiyası adi mötərizələr içərisində dırnaq işarələr arasında bölmək istədiyimiz mətn, vergül və daha sonra dırnaq işarələr arasında ayırıcı. Bu mətndə ayırıcı “probel” olduğuna görə dırnaq işarələri arasını boş qoyuruq. Bidiyiniz kimi N işarəsi Unicod üçün istifadə olunur, bizim mətndə “ə” və “ö” hərfləri olduğu üçün istifadə etmişik. Nəticədə alırıq:

netice1

Gördüyünüz kimi sözlər ardıcıl alt-alta bir sütuna yığıldı və bu sütunun adı ilkin təyinetməyə görə (default) value adlandırılır.

Misal 2: Cədvəlimizin sətrində belə bir mətnimiz var:  “SQL, T-SQL, PL/SQL” Bu sətri sözlərə ayırmaq və bu sözləri bir sütuna düzmək üçün bu formada yaza bilərik:

SELECT * 
FROM STRING_SPLIT('SQL, T-SQL, PL/SQL', ',');

Burada ayırıcı işarə qismində dırnaqlar arasında vergül göstərilib. Nəticədə alırıq:

Netice2

Misal 3: Bu misalda göstərilir ki, yalnız bir ayırıcıdan istifadə edə bilərik.

Fərz edək ki, cədvəlimizin sətrində belə bir mətnimiz var:  “SQL,@ T-SQL, PL/SQL” Bu mətni sözlərə ayırmaq və bu sözləri bir sütuna düzmək üçün bu cür yazsaq:

SELECT * 
FROM STRING_SPLIT('SQL,@T-SQL, PL/SQL', ',@');

Aşağıda göstərilən səhv mesaji alacağıq:

netice3

Deməli biz ayırıcı (separator) qismində yalnız ncar(1) və nvarchar(1) tipli cəmi bir işarədən istifadə edə bilərik.

Misal 4: Fərz edək ki bizim bir Articles adlı cədvəlimiz var və bu cədvəlin Tags adlı bir sütunu var. Bu sütunda hər bir məqaləyə uyğun açar sözlər (tag) vergül işarəsi ilə bir birindən ayrılaraq yerləşdirilib.

Ntice4

Biz istəyirik ki hər bir məqalə üçün açar sözlər bir sətirdə deyil ayrı-ayrı sətirdə açar sözlərə bölünərək göstərilsin. Əvvəllər bunu etmək üçün biz qəliz CLR və skalyar funksiyalardan istifadə etməliydik. İndi isə yeni STRING_SPLIT funksiyası ilə bunu asanlıqla edə bilərik. Bu funksiyanı sütunlara görə  birləşdirmək üçün CROSS APPLY istifadə etməliyik:

SELECT ArticleId, Name, value
FROM Articles
CROSS APPLY STRING_SPLIT(Tags, ',');

Nəticədə alırıq:

Netice5

Gördüyünüz kimi bütün məqalələr üçün “tag”lar ayrı-ayrı sətirlərdə yerləşdirildi. Yeni funksiya çox lazımlı və çox istifadə edilən funksiyalardan biri olacaq.

Hələlik bu qədər. Növbəti məqalələrdə görüşənədək.

Diqqətinizə görə təşəkkür edirəm.

Səs: +30. Bəyənilsin Zəifdir

Müəllif: Rauf Khalafov

Şərh yazın