SQL SQERVER Sayıyı Yazı ile Yazma
SQL Server’da Sayıları Yazıya Çevirme (T-SQL Fonksiyonu)
Finansal raporlar, fatura işlemleri veya çek yazımı gibi işlemler sırasında, sayısal verileri metin formatında göstermek gerekebilir. Özellikle para birimlerini tam metin olarak yazdırmak, yanlış anlaşılmaları önlemek için önemlidir.
Bu yazımda, SQL Server’da sayıları yazıya çevirmek için özel olarak hazırladığım T-SQL fonksiyonlarını paylaşacağım. Bu fonksiyonlar sayesinde 1853768,55 gibi bir tutarı “Bir Milyon Sekiz Yüz Elli Üç Bin Yedi Yüz Altmış Sekiz TL Elli Beş Kuruş” şeklinde metin olarak elde edebilirsiniz.
Kodlar, tam sayıları ve ondalık (kuruş) kısmını ayrı ayrı işleyerek, Türk Lirası ve kuruş formatına uygun bir çıktı üretiyor. Ayrıca büyük sayılar için milyar, milyon, bin gibi ifadeleri de destekliyor. Eğer finansal verilerinizi SQL Server’da doğrudan metne çevirmek istiyorsanız, bu fonksiyonları kendi sistemlerinize kolayca entegre edebilirsiniz.
1. Sayıyı Yazıya Çeviren Fonksiyon
CREATE FUNCTION dbo.TutarYaziyla (@Tutar MONEY) RETURNS NVARCHAR(MAX) AS BEGIN DECLARE @ParaBölüm NVARCHAR(4000) DECLARE @KurusBölüm NVARCHAR(50) DECLARE @TamSayiBölüm BIGINT DECLARE @OndalikBölüm INT -- Tam sayı ve kuruş kısmını ayır SET @TamSayiBölüm = FLOOR(@Tutar) SET @OndalikBölüm = CAST((@Tutar - @TamSayiBölüm) * 100 AS INT) -- Tam sayı kısmını yazıya çevir IF @TamSayiBölüm > 0 SET @ParaBölüm = dbo.SayiYaziyla(@TamSayiBölüm) + ' TL' ELSE SET @ParaBölüm = 'Sıfır TL' -- Kuruş kısmını yazıya çevir IF @OndalikBölüm > 0 SET @KurusBölüm = ' ' + dbo.SayiYaziyla(@OndalikBölüm) + ' Kuruş' ELSE SET @KurusBölüm = '' -- Sonucu döndür RETURN LTRIM(RTRIM(@ParaBölüm + @KurusBölüm)) END
2. Sayıyı Kelimeye Çeviren Yardımcı Fonksiyon
CREATE FUNCTION dbo.SayiYaziyla (@Sayi BIGINT) RETURNS NVARCHAR(MAX) AS BEGIN DECLARE @Yazi NVARCHAR(MAX) = '' DECLARE @Birlikler TABLE (Num INT, Kelime NVARCHAR(20)) DECLARE @Onluklar TABLE (Num INT, Kelime NVARCHAR(20)) DECLARE @Basamaklar TABLE (Num INT, Kelime NVARCHAR(20)) -- Birlikler INSERT INTO @Birlikler VALUES (1, 'Bir'), (2, 'İki'), (3, 'Üç'), (4, 'Dört'), (5, 'Beş'), (6, 'Altı'), (7, 'Yedi'), (8, 'Sekiz'), (9, 'Dokuz') -- Onluklar INSERT INTO @Onluklar VALUES (10, 'On'), (20, 'Yirmi'), (30, 'Otuz'), (40, 'Kırk'), (50, 'Elli'), (60, 'Altmış'), (70, 'Yetmiş'), (80, 'Seksen'), (90, 'Doksan') -- Basamak Adları INSERT INTO @Basamaklar VALUES (100, 'Yüz'), (1000, 'Bin'), (1000000, 'Milyon'), (1000000000, 'Milyar') -- Sayıyı işle DECLARE @GeçiciSayi BIGINT = @Sayi DECLARE @Basamak INT DECLARE @Kelime NVARCHAR(50) DECLARE @Sira INT = 0 WHILE @GeçiciSayi > 0 BEGIN SET @Basamak = @GeçiciSayi % 1000 SET @GeçiciSayi = @GeçiciSayi / 1000 IF @Basamak > 0 BEGIN SET @Kelime = '' -- **Yüzler Basamağı Düzeltilmiş** IF @Basamak >= 100 BEGIN SELECT @Kelime = Kelime FROM @Birlikler WHERE Num = (@Basamak / 100) IF @Kelime = 'Bir' SET @Kelime = '' SET @Kelime = @Kelime + ' Yüz' SET @Basamak = @Basamak % 100 END -- **Onlar Basamağı** IF @Basamak >= 10 BEGIN SELECT @Kelime = @Kelime + ' ' + Kelime FROM @Onluklar WHERE Num = (@Basamak / 10) * 10 SET @Basamak = @Basamak % 10 END -- **Birler Basamağı** IF @Basamak > 0 SELECT @Kelime = @Kelime + ' ' + Kelime FROM @Birlikler WHERE Num = @Basamak -- **Bin, Milyon gibi ekler** IF @Sira = 1 AND @Kelime = ' Bir' SET @Kelime = 'Bin' ELSE IF @Sira > 0 SELECT @Kelime = @Kelime + ' ' + Kelime FROM @Basamaklar WHERE Num = POWER(1000, @Sira) -- Sonuca ekle SET @Yazi = @Kelime + ' ' + @Yazi END SET @Sira = @Sira + 1 END RETURN LTRIM(RTRIM(@Yazi)) END
Kullanımı:
SELECT dbo.TutarYaziyla(121000) AS Sonuc -- ✅ "Yüz Yirmi Bir Bin TL" SELECT dbo.TutarYaziyla(1100) AS Sonuc -- ✅ "Bin Yüz TL" SELECT dbo.TutarYaziyla(1000) AS Sonuc -- ✅ "Bin TL" SELECT dbo.TutarYaziyla(1000000) AS Sonuc -- ✅ "Bir Milyon TL" SELECT dbo.TutarYaziyla(1234.56) AS Sonuc -- ✅ "Bin İki Yüz Otuz Dört TL Elli Altı Kuruş" SELECT dbo.TutarYaziyla(0.50) AS Sonuc -- ✅ "Sıfır TL Elli Kuruş"
Comments (1)
Denedim çalışıyor, teşekkürler Turgay Acar.