SQL Server’da STUFF ve FOR XML PATH’in Birlikte Kullanımı
Herkese merhaba,
Bu yazıda SQL Server’da STUFF ve FOR XML PATH‘in birlikte kullanımından bahsedeceğim.
SQL Server’da bu iki ifade ile örnek çok fazla görmüşsünüzdür ama nasıl kullanıldığı ile ilgili çok fazla detaylı kaynak yoktur.
Bu yazıda bu konuyu ele almaya çalışacağım.
Öncelikli olarak SQL Server’da STUFF fonksiyonu bir ifadenin belli bir yerini başka bir ifade ile değiştirmek için kullanılır
FOR XML PATH ise tablo şeklinde oluşturulmuş verilerden karmaşık XML belgeleri oluşturulmak istenildiğinde en iyi kullanılacak araçtır.
Peki ikisini birlikte nasıl kullanacağız ve ne işimize yarayacak?
İlk olarak aşağıdaki tabloyu oluşturup verileri tablo içerisine ekleyelim.
--Personel Tablosunu Oluşturulması
CREATE TABLE PersonelTablosu
(
Id INT PRIMARY KEY IDENTITY(1, 1),
PersonelTip INT NOT NULL,
PersonelAdi VARCHAR(255)
);
--Personel Tablosuna Veri Eklenmesi
INSERT INTO PersonelTablosu
(
PersonelTip,
PersonelAdi
)
VALUES
(1, 'Yavuz'),
(1, 'Hasan'),
(1, 'Bilge'),
(1, 'Pelin'),
(1, 'Büşra'),
(1, 'Kübra'),
(2, 'Mustafa'),
(2, 'Fevziye'),
(2, 'Necla'),
(2, 'Halis');
--Personel Tablosunun Kontrol Edilmesi
SELECT *
FROM PersonelTablosu;
Şimdi elimizde bir personel tablosu var. Bu personel tablosunda aşağıdaki kodu çalıştıralım.
--İlk kodumuz
SELECT ',' + PersonelAdi
FROM PersonelTablosu
FOR XML PATH('');
Bu kodu çalıştırdığınızda aşağıdaki sonucu alacaksınız.
Görüldüğü üzere en başta virgül var. Bu virgülü nasıl kaldıracağız. STUFF fonksiyonu ile bu işlemi yapıyoruz. Aşağıdaki kodu çalıştıralım.
--İkinci kodumuz
SELECT PersonelAdi = STUFF(
(
SELECT ',' + PersonelAdi FROM PersonelTablosu FOR XML PATH('')
),
1,
1,
''
)
FROM PersonelTablosu;
Görüldüğü üzere virgül kalktı ama satır çokladı. Bu satır çoklama işini nasıl çözeceğiz. Aşağıdaki kodu çalıştıralım.
SELECT PersonelTip,
PersonelAdi = STUFF(
(
SELECT ',' + PersonelAdi
FROM PersonelTablosu t1
WHERE t1.PersonelTip = t2.PersonelTip
FOR XML PATH('')
),
1,
1,
''
)
FROM PersonelTablosu t2
GROUP BY PersonelTip;
Görüldüğü üzere PersonelTip’e göre SUBQUERY yapıp grupladığımız zaman bu sıkıntı da gitmiş oldu.
Herkese çalışma hayatında ve yaşamında başarılar kolaylıklar.